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

时间:2013-01-16 01:06:03

标签: 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中虚拟化虽然已启用但并未真正起作用?

1 个答案:

答案 0 :(得分:2)

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