【问题标题】:ItemsControl with VirtualizingStackPanel disables horizontal animations in ScrollViewer带有 VirtualizingStackPanel 的 ItemsControl 禁用 ScrollViewer 中的水平动画
【发布时间】:2020-07-15 03:11:01
【问题描述】:

我正在为一个 UWP 应用程序构建一个自定义 XAML 控件,该应用程序严重依赖具有捕捉点的 ScrollViewer。

我非常希望将绑定到控件的内容虚拟化,因此我使用了 ItemsControl。但是,当我在 ItemsControl 中使用 VirtualizingStackPanel,然后在 ScrollViewer 上调用 ChangeView() 到特定的 Horizo​​ntalOffset 时,滚动到新偏移量时的动画效果被禁用(它只是直接跳转到偏移量)。如果我只是将 VirtualizingStackPanel 替换为 StackPanel(无虚拟化),则水平动画会起作用。

问题:有谁知道如何使用 VirtualizingStackPanel在更改偏移量时启用水平动画?

这是调整水平偏移量的 C#(customScrollViewer 是通过树爬网访问的,因为它是 ControlTemplate 样式的一部分):

customScrollViewer.ChangeView(500, null, null, false);

这里是 ItemsControl 的 XAML 样式:

       <Style x:Key="ItemsControlSnapStyle" TargetType="ItemsControl">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ItemsControl">
                    <ScrollViewer
                        x:Name="customScrollViewer"
                        VerticalScrollBarVisibility="Disabled" 
                        HorizontalScrollBarVisibility="Auto" 
                        HorizontalSnapPointsType="Mandatory">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

谢谢!

【问题讨论】:

    标签: xaml uwp uwp-xaml


    【解决方案1】:

    很好的问题,我可以重现这种行为,而且它看起来是设计使然。派生自 VirtualizingStackPanel 文档。 它只能用于在 ItemsControl 中显示项目。 通常。在remarks part从 Windows 8.1 开始,ItemsStackPanel 被用作 ListView 的默认 ItemsPanel。如果您修改 ItemsPanel,我们建议您使用 ItemsStackPanel 或 ItemsWrapGrid 而不是 VirtualizingStackPanel 或 WrapGrid。

    如果我们将VirtualizingStackPanel 替换为ItemsStackPanel,那么ChangeView 方法可以与动画一起使用。并且ItemsStackPanel 也支持virtualizes。所以我们建议您可以使用 ItemsStackPanel 作为 ItemsControl 的 ItemsPanel。

    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <ItemsStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    

    【讨论】:

    • 效果很好!老实说,我以为我走到了死胡同,没想到这里会有解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2021-01-05
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多