2010-07-19 43 views
3

我有一個TabControl,它有兩個TabItems。這兩個TabItem中的每一個都有一個列表框。在SelectionChanged事件處理程序中,我將相應ListBox的ItemSource屬性設置爲null,並使用Collection填充另一個ListBox。現在,當我繼續選擇每個選項卡時,會出現內存尖峯。爲什麼是這樣?如果我們在WPF中將控件的ItemSource屬性設置爲null,是否會發生內存泄漏?

+0

你確定它的列表框導致內存秒殺,而不是它自己的TabControl? WPF中的TabControls將僅保存當前選定選項卡的可視化樹。當您更改選定的選項卡時,TabControl將爲新選定的選項卡構建可視化樹,這會導致內存消耗(+ CPU)。 – ThomasAndersson 2010-10-21 11:33:37

回答

1

嘗試不更換標籤時清空列表,我不認爲WPF會嘗試繪製列表,如果它沒有被顯示。當我需要做一個列表框/ ItemsControl的顯示對象的集合,我這樣做:

//have all the usual usings and 
using System.ComponentModel 
using System.Collections.ObjectModel 
class Bar : INotifyPropertyChanged 
{ 
    //make your properties setters call PropertyChanged 
} 
class Bars : ObservableCollection<Bar> 
{ 
} 

然後設置列表框有ItemsSource作爲你的Bars實例,並使用數據模板來顯示每個Bar。這意味着你不必再次設置ItemsSource(因爲我猜測這是泄漏發生的地方,因爲ObservableCollection會自動告訴列表框更新,以便更新某些內容)。通過不重複地更改ItemsSource程序將可能效率更高,但這不是一個保證:)如果你絕望,紅門做免費的.net reflector,所以你可以看看你的ListBox實際上在做什麼。

另一個問題可能是列表框沒有正確虛擬化,但我似乎記得列表框做了虛擬化,但您需要第二個選擇。

相關問題