我有一个包含数据列表的ItemsControl
,我想对其进行虚拟化,但是使用VirtualizingStackPanel.IsVirtualizing="True"
在ItemsControl
上似乎不起作用。
这是真的吗?或者有其他我不知道的方式可以实现吗?
为了测试,我一直在使用以下代码块:
<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Initialized="TextBlock_Initialized"
Margin="5,50,5,50" Text="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如果我将ItemsControl
更改为ListBox
,我可以看到Initialized
事件仅运行了少数几次(巨大的边距只是为了我只需要浏览少量记录),但是对于ItemsControl
,每个项都会被初始化。
我尝试将ItemsControlPanelTemplate
设置为VirtualizingStackPanel
,但似乎没有帮助。
ScrollViewer.CanContentScroll="True"
是实现虚拟化必需的,但它有一个缺点,即使在列表末尾会导致不需要的空间,因为它使用基于项目而不是像素的处理方式。然而,自 .NET 4.5 以来,可以通过将VirtualizingPanel.ScrollUnit="Pixel" VirtualizingPanel.IsContainerVirtualizable="True"
添加到ItemsControl
来解决这个问题。 - RonnyR