我最近开始探索WPF中的数据和UI虚拟化功能,偶然发现了一些奇怪的东西。

我创建了一个启用了DataGridVirtualizing,并用包含1,000,000个项目的列表填充了它。这非常有效,而且速度惊人。

<Grid>
    <DataGrid x:Name="employees" VirtualizingPanel.IsVirtualizing="True"
                                 VirtualizingPanel.IsContainerVirtualizable="True"
                                 VirtualizingPanel.VirtualizationMode="Recycling"/>
</Grid>

但是,当我将其嵌套在StackPanel下时,它将加载一分钟以上,直到获得OutOfMemoryException为止。我也在VirtualizingPanel上设置了相同的StackPanel属性,但这无济于事。

这种行为是故意的还是我在这里缺少基本的东西?以及如何在嵌套控件中支持数据虚拟化?

最佳答案

StackPanel是“无限容器”(请注意引号),从某种意义上讲,它不像GridDockPanel那样限制子元素的大小。

就UI虚拟化而言,这意味着,由于您的DataGrid不受Height的限制,它将无限增长并呈现所有项目,从而有效地失去了UI虚拟化。

有关更多详细信息,请参见MSDN: WPF Layout

最重要的是,您需要确保根据需要使用适当的布局容器。

10-08 18:52