Xaml 带有VirtualzingStackPanel的ItemsControl在ScrollViewer中禁用水平动画

Xaml 带有VirtualzingStackPanel的ItemsControl在ScrollViewer中禁用水平动画,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我正在为UWP应用程序构建一个自定义XAML控件,该应用程序严重依赖于带有捕捉点的ScrollViewer 我真的希望绑定到控件的内容被虚拟化,所以我使用的是ItemsControl。但是,当我在ItemsControl中使用VirtualzingStackPanel,然后在ScrollViewer上调用ChangeView以指定水平偏移量时,滚动到新偏移量时的动画效果将被禁用,它只是直接跳到偏移量。如果我简单地将VirtualzingStackPanel替换为StackPanel(无虚拟化),

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

我真的希望绑定到控件的内容被虚拟化,所以我使用的是ItemsControl。但是,当我在ItemsControl中使用VirtualzingStackPanel,然后在ScrollViewer上调用ChangeView以指定水平偏移量时,滚动到新偏移量时的动画效果将被禁用,它只是直接跳到偏移量。如果我简单地将VirtualzingStackPanel替换为StackPanel(无虚拟化),则水平动画可以工作

问题:是否有人知道在更改偏移时如何使用虚拟化StackPanel并启用水平动画

下面是调整customScrollViewer通过树爬行访问的水平偏移量的C,因为它是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>

谢谢

好问题,我可以复制这种行为,它看起来是经过设计的。从文档中派生。它只能用于显示ItemsControl中的项。通常地首先,从Windows 8.1开始,ItemsStackPanel用作ListView的默认ItemsPanel。如果修改ItemsPanel,我们建议您使用ItemsStackPanel或ItemsRapGrid,而不是VirtualizingStackPanel或WrapGrid

若我们用ItemsStackPanel替换VirtualizingStackPanel,那个么ChangeView方法可以与动画一起工作。ItemsStackPanel也支持虚拟化。因此,我们建议您可以使用ItemsStackPanel作为ItemsControl的ItemsPanel

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

很好的问题,我可以复制这种行为,而且它看起来是经过设计的。从文档中派生。它只能用于显示ItemsControl中的项。通常地首先,从Windows 8.1开始,ItemsStackPanel用作ListView的默认ItemsPanel。如果修改ItemsPanel,我们建议您使用ItemsStackPanel或ItemsRapGrid,而不是VirtualizingStackPanel或WrapGrid

若我们用ItemsStackPanel替换VirtualizingStackPanel,那个么ChangeView方法可以与动画一起工作。ItemsStackPanel也支持虚拟化。因此,我们建议您可以使用ItemsStackPanel作为ItemsControl的ItemsPanel

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

它工作得很好!老实说,我认为我已经走到了死胡同,没想到会有解决办法。非常感谢。它工作得很好!老实说,我认为我已经走到了死胡同,没想到会有解决办法。非常感谢。