2013-11-25 68 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>