2010-09-15 56 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

相關問題