1

我在 WPF 窗口中有网格,在里面有一个 DataGrid 控件:

<Grid>
    <DataGrid ItemsSource="{Binding AllAuthors}" />
</Grid>

AllAuthors是一个简单ObservableCollection<Author>Author类,只有几个字符串属性。该集合在后面的代码中填充了大约 40000 个对象。DataGrid 会很快打开(1 秒后),并且通过 datagrid 的导航顺畅而快速。该应用程序的内存负载为 35 MB。

如果我将上面的代码替换为...

<StackPanel>
    <DataGrid ItemsSource="{Binding AllAuthors}" />
</StackPanel>

...当应用程序尝试显示 DataGrid 时,应用程序以 100% 的 CPU 负载运行,内存持续增长到 1.5 GB。最后我收到一个OutOfMemoryException.

我是 WPF 初学者,现在想知道这里出了什么问题。(我正在使用 VS2010、.NET 4.0 和 WPF 4.0 的内置 DataGrid 控件)

提前感谢您的帮助!

4

1 回答 1

1

只要它在网格中,这不是问题,因为实际上可能只生成了几个项目 - 当前实际可见的项目。这称为 UI 虚拟化,并内置在 WPF 中的多个 ItemsControl 中。由于 DataGrid 很小,实际生成的 Item 并不多。

但是,当您将它放在 StackPanel 中时,您可能已经构建了一个布局,其中 StackPanel 扩展到 DataGrid 的高度,而 DataGrid 占用了它认为需要的尽可能多的空间。我们需要查看完整的 xaml 以查看是否是这种情况。无论如何,如果是的话,现在实际上有相当多的项目“可见”(即所有项目)。而生成 40000 个项目显然不是一个好主意。

您是否比较了两个 DataGrid 的 ActualHeight 属性?

于 2010-09-15T13:22:58.687 回答