【问题标题】:Hide scrollbar buttons independantly独立隐藏滚动条按钮
【发布时间】:2013-12-10 06:40:43
【问题描述】:

我为滚动条(水平)创建了一个自定义模板,它现在只包含两个不带滚动条的滚动按钮,它们都位于单独的网格列中。当我们不能再向右滚动时,我希望右键消失,反之亦然。 我可以将滚动查看器模板中的滚动条可见性设置为:

Visibility="{TemplateBinding ComputedHorizo​​ntalScrollBarVisibility}"

它只会在必要时显示滚动条,但看不到滚动条内的任何属性,当滚动条到达最右边或最左边的位置时,我可以将可见性属性绑定到… 不知道该怎么做,所以任何建议都会很棒。

【问题讨论】:

    标签: wpf xaml scrollbar


    【解决方案1】:

    可以这样...

    <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>
    

    【讨论】:

      【解决方案2】:

      WPF 中的滚动由IScrollInfo Interface 负责。它的LineLeft()LineRight()PageLeft()PageRight() 方法执行实际的内容滚动,并由ScrollBar ControlTemplate 中的各种RepeatButtons 执行。它还提供了HorizontalOffsetViewportWidthExtentWidth 属性,您可以使用它们来确定滚动内容的位置。这些方法和属性在ScrollViewer 类中公开。

      虽然我没有尝试过,但我相信您可以检测到内容何时滚动到最右侧,如下所示:

      bool isAtRightSide = HorizontalOffset >= ExtentWidth - ViewportWidth;
      

      HorizontalOffset 属性获取滚动内容的水平偏移量
      ExtentWidth 属性获取范围的水平大小。(总大小)
      ViewportWidth 属性获取此内容的视口的水平尺寸。

      【讨论】:

      • 问题是我没有代码,因为我要创建一个框架控件,一切都完全在 XAML 中定义。
      • 简而言之,您不能在纯 XAML 中执行此操作。此外,如果这是你的要求,那么你应该把它放在你的问题中。但是,如果您创建 CustomControl,那么您可以将代码与 XAML 一起使用。
      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      相关资源
      最近更新 更多