2013-11-25 89 views
0

我爲滾動條(水平)創建了一個自定義模板,它現在只包含沒有滾動條的兩個滾動按鈕,它們都在單獨的網格列中。當我們不能再滾動到右側時,右側按鈕消失,反之亦然。 我可以在ScrollViewer中模板設置滾動條可見性:獨立隱藏滾動條按鈕

能見度=「{TemplateBinding ComputedHorizo​​ntalScrollBarVisibility}」

這隻會在必要時顯示滾動欄,但不認爲這會暴露滾動條所指的任何財產當滾動條到達其最右邊或最左邊的位置,我可以將可見性屬性綁定到... 不確定如何去做這個,所以任何建議都會很棒。

回答

0

在WPF中滾動由IScrollInfo Interface負責。其LineLeft(),LineRight(),PageLeft()PageRight()方法執行實際內容滾動並由ScrollBar ControlTemplate中的各種RepeatButton執行。它還提供了HorizontalOffset,ViewportWidthExtentWidth屬性,您可以使用這些屬性來確定滾動內容的位置。這些方法和屬性暴露在ScrollViewer類中。

雖然我還沒有試過,我相信,當滾動內容時你可以檢測到最右邊的是這樣的:

bool isAtRightSide = HorizontalOffset >= ExtentWidth - ViewportWidth; 

HorizontalOffset財產獲取水平滾動的內容偏移。
ExtentWidth屬性獲取範圍的水平大小。(總大小)
ViewportWidth屬性獲取此內容的視口的水平大小。

+0

的問題是我沒有後面的代碼,因爲我綁建立一個框架控制,一切都在XAML完全定義。 – CreativeAbyss

+0

簡而言之,您無法在純XAML中執行此操作。此外,如果這是你的要求,那麼你應該把它放在你的問題中。但是,如果您創建了「CustomControl」,那麼您可以*使用XAML代碼。 – Sheridan

0

它可以這樣做......

<MenuScrollingVisibilityConverter x:Key="MenuScrollingVisibilityConverter" /> 

<Style x:Key="HorizontalScrollViewerStyle" 
     TargetType="{x:Type ScrollViewer}"> 
    <Setter Property="OverridesDefaultStyle" 
      Value="True" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition /> 
       <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <ScrollContentPresenter Grid.Column="1" /> 
       <RepeatButton Command="{x:Static ScrollBar.LineLeftCommand}" 
          CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=.}"> 
       <RepeatButton.Visibility> 
        <MultiBinding Converter="{StaticResource MenuScrollingVisibilityConverter}" 
            ConverterParameter="0" 
            FallbackValue="Visibility.Collapsed"> 
         <Binding Path="ComputedHorizontalScrollBarVisibility" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="HorizontalOffset" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="ExtentWidth" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="ViewportWidth" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
        </MultiBinding> 
       </RepeatButton.Visibility> 
       </RepeatButton> 
       <RepeatButton Grid.Column="2" 
          Command="{x:Static ScrollBar.LineRightCommand}" 
          CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=.}"> 
       <RepeatButton.Visibility> 
        <MultiBinding Converter="{StaticResource MenuScrollingVisibilityConverter}" 
            ConverterParameter="100" 
            FallbackValue="Visibility.Collapsed"> 
         <Binding Path="ComputedHorizontalScrollBarVisibility" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="HorizontalOffset" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="ExtentWidth" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
         <Binding Path="ViewportWidth" 
           RelativeSource="{RelativeSource TemplatedParent}" /> 
        </MultiBinding> 
       </RepeatButton.Visibility> 
       </RepeatButton> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style>