2

我有以下 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,如此处所建议

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

知道为什么会这样吗?是不是在 Windows XP 中,虚拟化虽然已启用但并没有真正起作用?

4

1 回答 1

2

很可能内部属性被设置回 false。正如 CLR 4.5 中的链接中提到的,您可以将 ScrollUnit 设置为像素。所以也许你在那个系统上有 Clr 4.5,因为它没有被设置为像素,所以 IsPixelBased 被设置回来。您可以更改附加的行为以设置 ScrollUnit(如果存在)。

于 2013-01-16T02:24:40.597 回答