2010-09-15 101 views
1

我有一个WPF窗口网格和内DataGrid控件:的DataGrid在一个StackPanel导致OutOfMemoryException异常

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

AllAuthorsObservableCollection<Author>Author一个简单的类,只有少数字符串属性。该集合中大约有40000个代码位于后面的对象。 DataGrid打开速度很快(1秒后),并且通过数据网格的导航变得平稳和快速。该应用程序具有35 MB的内存负载。

如果我代替上述由代码...

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

...应用100%的CPU负载和运行内存连续地生长高达1,5 GB,而应用程序试图以显示数据网格。最后我收到OutOfMemoryException

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

感谢您提前给予帮助!

+0

你帮我找到了我的麻烦:我用Task.run()管理所有东西,当我“更新”我的集合,并提高OnPropertyChanged()时,工具崩溃时具有相同的行为(最大RAM, OutOfMemoryException异常)。我搜索了几个小时以了解我的c#代码中出了什么问题,但最后,这是由于UI线程创建了一个巨大的堆栈面板!谢谢 – Simon 2017-01-05 19:17:13

回答

1

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

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

你比较了两个DataGrids的ActualHeight属性吗?

+0

感谢您的回复!我刚刚为Grid和StackPanel布局比较了ActualHeight(只有500个项目),你说得对:如果DataGrid在Grid中,那么高度只有440,如果它在StackPanel中,它会增长到8800以上。我还在DataGrid上设置了'EnableRowVirtualization = False'来进行测试,在这种情况下,我与Grid布局具有相同的内存和性能问题。我不明白的是为什么我的内存负载超过1.5 GB。 '作者'对象的大小小于200 Byte,所以有1,5万GB来自哪个对象? – Slauma 2010-09-15 13:48:56

+0

这来自基于ItemTemplate为每个'Author'项目生成的所有WPF视觉效果。 – bitbonk 2010-09-15 14:00:28

+0

好的,我明白了。我已经在DataGrid上指定了一个400的Height,现在它也与StackPanel一起工作。所以,如果我正确地得出结论,一个'Grid'将网格内的控件限制到可见的窗口区域,而'StackPanel'可以根据内部不同控件的需要增长到窗口的不可见区域。是对的吗?无论如何,你的回答非常有帮助。再次感谢! – Slauma 2010-09-15 14:07:11

相关问题