如果我们在WPF中将控件的ItemSsource属性设置为null,是否会泄漏内存?

时间:2010-07-19 05:46:49

标签: wpf memory-leaks wpf-controls

我有一个TabControl,它有两个TabItems。这两个TabItem中的每一个都有一个列表框。在SelectionChanged事件处理程序上,我将相应ListBox的ItemSource属性设置为null,并使用Collection填充另一个。现在,当我继续选择每个Tab时,会出现内存峰值。这是为什么?

2 个答案:

答案 0 :(得分:1)

尝试在更改标签时不清空列表,如果没有显示,我认为WPF不会尝试绘制列表。当我需要使listbox / 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程序将可能更有效但如果您绝望,那么这不是保证:),Red-Gate会免费.net reflector所以你可以看看ListBox实际上在做什么。

另一个问题可能是列表框没有正确虚拟化,但我似乎记得ListBoxes做了虚拟化,但你需要第二个意见。

答案 1 :(得分:0)

即使它没有以这种方式出现,但TabControl只是一个普通的ItemsControl。 http://msdn.microsoft.com/en-us/library/system.windows.controls.tabcontrol.aspx

将所选项目设置为选项卡,可视树由其包含的内容完整构建。

如果您有冻结页面,请尝试在Task Factory中异步加载数据。

也许清除你的Collection而不是将它设置为null:)