WPF 如何影响滚动视图的滚动量

低的

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

当我按下重复按钮时,滚动的量很小,只有 one 宽度的一小部分TabItem

我希望这个更大。我想(最小)滚动TabItem.

我已经使用了CanContentScrolla属性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;
    }
}
机械臂

SmallChangeWPF属性ScrollBar仅在滚动条是独立的(即不在ScrollViewer时才考虑用于滚动由于您ScrollViewer在控制模板中使用了 a ,因此这将永远不会起作用。AScrollViewer将始终应用 16 个单位的默认小更改。

你现在有两个选择:

  • IScrollInfo在包装类中实现(例如从 a 派生ContentControl),将其作为内容附加到滚动查看器,放在TabPanel这个自定义包装类内部,将 的CanContentScroll属性设置ScrollViewertrue现在您可以完全控制滚动。
  • 使用一个小技巧:创建一个外部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属性,并允许可重用​​性)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得滚动视图的滚动量

来自分类Dev

WPF如何使StackPanel可滚动

来自分类Dev

WPF Scrollviewer ItemsControl滚动项目进入视图

来自分类Dev

WPF 设计:查看整个滚动视图

来自分类Dev

c#WPF滚动视图根据滚动位置打印

来自分类Dev

如何使键盘可滚动的只读WPF TextBox?

来自分类Dev

如何使scrollviewer滚动像素而不是组件(WPF)

来自分类Dev

wpf DataGrid RowDetailsTemplate滚动

来自分类Dev

WPF ListBox滚动难题

来自分类Dev

GeometryReader影响滚动视图

来自分类Dev

WPF滚动条内容

来自分类Dev

在WPF中滚动多个图像

来自分类Dev

WPF缩放+滚动条?

来自分类Dev

无法在WPF ListBox中滚动

来自分类Dev

WPF XAML ScrollViewer 不会滚动

来自分类Dev

滚动视图内的recyclerview影响滚动位置

来自分类Dev

滚动视图内的recyclerview影响滚动位置

来自分类Dev

添加数据后如何滚动到ListView的末尾-WPF

来自分类Dev

如何在WPF ToolKit DataGrid中禁用滚动刷新动画?

来自分类Dev

如何阻止滚动更改事件触发数据绑定(WPF)

来自分类Dev

如何使WPF WebView像webbrowser一样滚动?

来自分类Dev

添加数据后如何滚动到ListView的末尾-WPF

来自分类Dev

如何在WPF中使用带有滚动面板的滚动查看器

来自分类Dev

jQuery滚动事件:如何确定以像素为单位的滚动量(滚动增量)?

来自分类Dev

垂直滚动条不在WPF中的列表视图的网格内查看

来自分类Dev

WPF DataGrid-在运行时从滚动视图中修改视觉效果

来自分类Dev

如何使视图针对滚动视图动画滚动?

来自分类Dev

WPF网格不显示滚动条

来自分类Dev

WPF通过子容器滚动父容器