我最近开始探索WPF中的数据和UI虚拟化功能,偶然发现了一些奇怪的东西。
我创建了一个启用了DataGrid
的{{1}},并在其中填入了包含1,000,000个项目的列表。这种方法效果非常好而且速度惊人。
Virtualizing
但是,当我将其嵌套在<Grid>
<DataGrid x:Name="employees" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
</Grid>
下时,它会加载超过一分钟,直到我得到StackPanel
。我在OutOfMemoryException
上设置了相同的VirtualizingPanel
属性,但它没有帮助。
这种行为是故意还是我遗漏了一些基本的东西?我如何设法在嵌套控件中支持数据虚拟化?
答案 0 :(得分:9)
StackPanel
是一个“无限容器”(注意引号),因为它不会对其子项的大小施加限制,例如Grid
或{{1}确实。
这意味着在UI虚拟化方面,由于DockPanel
不限于DataGrid
,因此它会无限增长并呈现所有内容,从而有效地失去了UI虚拟化。
有关详细信息,请参阅MSDN: WPF Layout。
最重要的是,您需要确保使用适当的布局容器,具体取决于您的需求。