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