VirtualizingStackPanel 中的 WPF 4.0 基于像素的滚动

标签 wpf ui-virtualization

我有以下 XAML 代码段:

<ItemsControl ItemsSource="..." ItemTemplate="..." VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" ScrollViewer.CanContentScroll="True">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Vertical" utils:VirtualizingStackPanelAttachedProperties.IsPixelBasedScrollingEnabled="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <Border BorderThickness="..." Padding="..." BorderBrush="..." Background="..." SnapsToDevicePixels="True">
               <ScrollViewer Padding="..." Focusable="False">
                   <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
               </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

如您所见,我有 ScrollViewer.CanContentScroll="True"和 utils:VirtualizingStackPanelAttachedProperties.IsPixelBasedScrollingEnabled="True"(这是一个将 IsPixelBased 内部属性设置为 true 的附加属性,如建议的 here )。

这在 Windows XP 中按预期工作,其中滚动是细粒度的、基于像素的。
但是,这在 Windows 7 中无法按预期工作,其中滚动仍然基于项目,与 Windows XP 中未将上述附加属性设置为 True 时的情况相同。
在 Windows 7 中实现基于像素的滚动的唯一方法是将 CanContentScroll 设置为 False,但这会关闭虚拟化。

知道为什么会发生这种情况吗?是否存在这样的情况:在 Windows XP 中,尽管启用了虚拟化,但虚拟化并未真正发挥作用?

最佳答案

很可能内部属性被设置回 false。正如 CLR 4.5 中的链接中提到的,您可以将 ScrollUnit 设置为像素。因此,也许您的系统上有 Clr 4.5,并且由于未将其设置为像素,因此 IsPixelBased 会被设置回来。您可以更改附加行为来设置 ScrollUnit(如果存在)。

关于VirtualizingStackPanel 中的 WPF 4.0 基于像素的滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14349848/

相关文章:

wpf - 设置 CanContentScroll = "false"时是否有虚拟化 ItemsControl 列表的解决方法?

WPF滑动面板

c# - 我可以动态地将 TextBlock.Text 的一部分设置为不同的颜色吗?

c# - ISupportIncrementalLoading 只触发一次

.net - 是否有适用于 WPF 的(好的/免费的)VirtualizingWrapPanel?

c# - Popup 中的 UI 虚拟化

c# - 存储 WPF 图像资源

c# - WPF ListBox 按钮选择的项目

c# - 仅在可见时延迟加载 System.Windows.Control.Image