Virtualizing an ItemsControl?
Virtualizing an ItemsControl?
我有一个包含数据列表的ItemsControl
,我希望对其进行虚拟化,但是将 VirtualizingStackPanel.IsVirtualizing=\"True\"
设置为真似乎对 ItemsControl
不起作用。
这是真的吗?还是有其他我不知道的方法?
为了测试,我使用了以下代码块:
如果我将 ItemsControl
更改为 ListBox
,我可以看到 Initialized
事件只运行了几次(巨大的边距只是为了只有少量记录),但作为 ItemsControl
,每个项都得到了初始化。
我尝试将 ItemsControlPanelTemplate
设置为 VirtualizingStackPanel
,但似乎也没有帮助。
实际上,让ItemsPanelTemplate
使用VirtualizingStackPanel
要做的事情比这要多得多。默认的ItemsControl
控件模板没有ScrollViewer
,而这是实现虚拟化的关键。添加到ItemsControl
的默认控件模板(使用ListBox
的控件模板作为模板)得到以下结果:
(顺便说一下,一个查看默认控件模板的好工具是Show Me The Template)
需要注意的事项:
你必须设置ScrollViewer.CanContentScroll="True"
,请看这里为什么。
还要注意我添加了VirtualizingStackPanel.VirtualizationMode="Recycling"
。这将减少TextBlock_Initialized
被调用的次数,只调用 TextBlocks 可见在屏幕上的次数。你可以在这里阅读更多关于UI虚拟化的内容。
编辑:忘记说明一个显而易见的解决方案了:你可以用ListBox
替换ItemsControl
:)(没有ScrollViewer.CanContentScroll="True"
时)
还要注意这个Optimizing Performance on MSDN page和ItemsControl
不在“实现性能特性的控件”表中,这就是为什么我们需要编辑控件模板的原因。