Скрыть кнопки полосы прокрутки независимо

Я создал собственный шаблон для полосы прокрутки (горизонтальный), который теперь содержит только две кнопки прокрутки без полосы прокрутки, обе из которых находятся в отдельном столбце сетки. Я хочу, чтобы правая кнопка исчезла, когда мы больше не можем прокрутить вправо и наоборот для левой кнопки. Я могу установить видимость полосы прокрутки в шаблоне scrollviewer:

Visibility = "{TemplateBinding ComputedHor horizontalScrollBarVisibility}"

Который будет показывать полосу прокрутки только тогда, когда это необходимо, но не будет видеть никакого свойства внутри полосы прокрутки, которое могло бы открыться, когда полоса прокрутки достигла крайнего правого или левого положения, к которому я мог бы привязать свойство видимости… Не совсем понятно, как это сделать, так Будем признательны любому совету.

2 ответа

Это можно сделать так...

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

Прокрутка в WPF позаботится о IScrollInfo Интерфейс это LineLeft(), LineRight(), PageLeft() а также PageRight() методы выполняют фактическую прокрутку содержимого и выполняются различными RepeatButtonв ScrollBar ControlTemplate, Это также обеспечивает HorizontalOffset, ViewportWidth а также ExtentWidth свойства, которые вы можете использовать, чтобы определить, где находится прокручиваемый контент. Эти методы и свойства выставлены на ScrollViewer учебный класс.

Хотя я не пробовал этого, я полагаю, что вы можете определить, когда содержимое прокручивается в крайнее правое положение, вот так:

bool isAtRightSide = HorizontalOffset >= ExtentWidth - ViewportWidth;

HorizontalOffset свойство получает горизонтальное смещение прокручиваемого содержимого.
ExtentWidth свойство получает горизонтальный размер экстента. (Общий размер)
ViewportWidth свойство получает горизонтальный размер области просмотра для этого содержимого.

Другие вопросы по тегам