WPF Как повлиять на количество прокрутки в просмотре прокрутки - PullRequest
0 голосов
/ 05 октября 2018

У меня есть TabControl, который имеет TabPanel, который помещается внутрь ScrollViewer.

<Style x:Key="TabCtrl" TargetType="{x:Type TabControl}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="Padding" Value="2,0,0,0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabControl}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <RepeatButton
                        x:Name="ScrolltoLeft_Btn"
                        Grid.Row="0"
                        Grid.Column="0"
                        VerticalAlignment="Top"
                        Command="{x:Static ScrollBar.LineLeftCommand}"
                        CommandTarget="{Binding ElementName=sv}"
                        Style="{StaticResource ScrolltoLeft}" />

                    <ScrollViewer
                        x:Name="sv"
                        Grid.Row="0"
                        Grid.Column="1"

                        HorizontalScrollBarVisibility="Hidden"
                        VerticalScrollBarVisibility="Disabled">

                        <TabPanel
                            x:Name="HeaderPanel"
                            Panel.ZIndex="1"
                            IsItemsHost="true"
                            KeyboardNavigation.TabIndex="1" />
                    </ScrollViewer>

                    <ContentPresenter
                        x:Name="PART_SelectedContentHost"
                        Grid.Row="1"
                        Grid.ColumnSpan="2"
                        Grid.Column="0"
                        Margin="{TemplateBinding Padding}"
                        ContentSource="SelectedContent"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />

                    <RepeatButton
                        x:Name="ScrolltoRight_Btn"
                        Grid.Row="0"
                        Grid.Column="2"

                        VerticalAlignment="Top"
                        Command="{x:Static ScrollBar.LineRightCommand}"
                        CommandTarget="{Binding ElementName=sv}"
                        Style="{StaticResource ScrolltoRight}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Когда я нажимаю кнопки повтора, прокручиваемое количество минимально, малая часть ширины одного TabItem.

Я хочу, чтобы это было больше.Я хочу (как минимум) прокрутить ширину TabItem.

Я уже играл со свойством CanContentScroll ScrollViewer, но это ничего не меняет.

Я также пытался изменить свойство SmallChange на горизонтальной полосе прокрутки, но это также не оказывает никакого влияния.

myTab.ApplyTemplate();
var scrollviewer = myTab.Template.FindName("sv", myTab) as ScrollViewer;
if (scrollviewer != null)
{
    scrollviewer.ApplyTemplate();
    _scrollBar = scrollviewer.Template.FindName("PART_HorizontalScrollBar", scrollviewer) as ScrollBar;
    if (_scrollBar != null)
    {
        _scrollBar.SmallChange = 0.5;
    }
}

1 Ответ

0 голосов
/ 05 октября 2018

Свойство SmallChange в WPF ScrollBar рассматривается только для прокрутки, когда полоса прокрутки является автономной (это означает, что не в ScrollViewer).Поскольку вы используете ScrollViewer в своем шаблоне управления, это никогда не сработает.A ScrollViewer всегда будет применять небольшое изменение по умолчанию, равное 16 единицам.

Теперь у вас есть две опции:

  • Реализация IScrollInfo в классе оболочки (например, производном от ContentControl), присоедините его к просмотру прокрутки в качестве содержимого, поместите TabPanel внутрь этого настраиваемого класса-оболочки, установите для свойства CanContentScroll ScrollViewer значение true.Теперь у вас есть полный контроль над прокруткой.
  • Используйте небольшой хак: создайте внешний ScrollBar и позвольте ему прокручивать ScrollViewer.

Я покажу вам второй подход:

Под ScrollViewer, добавьте новую полосу прокрутки:

<ScrollBar 
    x:Name="myScrollBar"
    Grid.Row="0" Grid.Column="1" Orientation="Horizontal"
    Visibility="Collapsed"
    Tag="{Binding ElementName=sv}"
    Minimum="0"
    Maximum="{Binding ScrollableWidth, ElementName=sv}"
    ViewportSize="{Binding ViewportWidth, ElementName=sv}"
    Value="{Binding HorizontalOffset, ElementName=sv, Mode=OneWay}"
    SmallChange="100"
    Scroll="MyScrollBar_OnScroll"/>

Вы можете изменить SmallChangeсвойство по вашему желанию.

Обновите обе команды прокрутки, чтобы указать эту полосу прокрутки, а не ScrollViewer:

<RepeatButton
    <!-- ... -->
    CommandTarget="{Binding ElementName=myScrollBar}"/>

Наконец, вам необходимо подключить внешнюю полосу прокрутки к ScrollViewer:

void MyScrollBar_OnScroll(object sender, ScrollEventArgs e)
{
  ScrollBar sb = (ScrollBar)sender;
  (sb.Tag as ScrollViewer)?.ScrollToHorizontalOffset(e.NewValue);
}

(Возможно, вы захотите сделать из этого Behavior, чтобы оставить пустой код, избежать использования свойства Tag и разрешить повторное использование).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...