代码之家  ›  专栏  ›  技术社区  ›  bas

WPF如何影响scrollview的滚动量

  •  0
  • bas  · 技术社区  · 6 年前

    我有一个 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

    我希望这个更大。我想(至少)滚动 标签项目

    我已经玩过了 CanContentScroll a的性质 滚动条

    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 回复  |  直到 6 年前
        1
  •  2
  •   dymanoid    6 年前

    这个 SmallChange WPF的性质 ScrollBar ScrollViewer ). 因为你用的是 将始终应用16个单位的默认小更改。

    您现在有两个选择:

    • 实施 IScrollInfo ContentControl ),将其作为内容附加到滚动查看器,并将 TabPanel 在这个定制包装类中,设置 CanContentScroll 滚动条 true . 现在您可以完全控制滚动。
    • 滚动条 让它滚动 滚动条

    我向您展示第二种方法:

    低于你的 滚动条 ,添加新的滚动条:

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

    你可以改变主意 零钱

    更新两个scroll命令以指向此滚动条,而不是 :

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

    最后,您需要将外部滚动条连接到 滚动条 :

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

    Behavior 为了避免使用 Tag