我最近开始探索WPF中的数据和UI虚拟化功能,偶然发现了一些奇怪的东西。
我创建了一个启用了DataGrid
的Virtualizing
,并用包含1,000,000个项目的列表填充了它。这非常有效,而且速度惊人。
<Grid>
<DataGrid x:Name="employees" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
</Grid>
但是,当我将其嵌套在
StackPanel
下时,它将加载一分钟以上,直到获得OutOfMemoryException
为止。我也在VirtualizingPanel
上设置了相同的StackPanel
属性,但这无济于事。这种行为是故意的还是我在这里缺少基本的东西?以及如何在嵌套控件中支持数据虚拟化?
最佳答案
StackPanel
是“无限容器”(请注意引号),从某种意义上讲,它不像Grid
或DockPanel
那样限制子元素的大小。
就UI虚拟化而言,这意味着,由于您的DataGrid
不受Height
的限制,它将无限增长并呈现所有项目,从而有效地失去了UI虚拟化。
有关更多详细信息,请参见MSDN: WPF Layout。
最重要的是,您需要确保根据需要使用适当的布局容器。