2013-11-25 3 views
0

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

Видимость = «{TemplateBinding ComputedHorizontalScrollBarVisibility}»

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

ответ

0

Прокрутка в WPF позаботится об IScrollInfo Interface. Его методы LineLeft(), LineRight(), PageLeft() и PageRight() выполняют фактическую прокрутку контента и выполняются различными RepeatButton s в ScrollBar ControlTemplate. Он также предоставляет свойства HorizontalOffset, ViewportWidth и ExtentWidth, которые вы можете использовать, чтобы определить, где находится прокрученный контент. Эти методы и свойства отображаются на классе 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> 
Смежные вопросы