【发布时间】:2017-03-01 13:31:33
【问题描述】:
这是我的 xaml:
<ListBox Grid.Row="4" HorizontalAlignment="Stretch" Margin="10,132,10,10" ScrollViewer.VerticalScrollBarVisibility="Disabled" Name="lbStatus" VerticalAlignment="Stretch" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"/>
还有我的 C# 代码:
public void DisplayStatusMessage(string msg)
{
if (lbStatus.Dispatcher.CheckAccess())
{
AddMessage(msg, Brushes.Black);
}
else
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
AddMessage(msg, Brushes.Black);
}));
}
}
private void AddMessage(string msg)
{
ListBoxItem status = new ListBoxItem();
status.Content = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss:fff ") + msg;
lbStatus.Items.Add(status);
lbStatus.ScrollIntoView(status);
status = null;
}
我在 while (true) 循环中调用 DisplayStatusMessage 以在列表框上显示状态。我的应用程序在一夜之间显着增长,这似乎表明列表框上存在内存泄漏。是否有替代列表框来显示无限状态?我认为将虚拟化设置为回收可以防止泄漏?
【问题讨论】:
-
如果您不需要保留以前的状态,那么最好使用最近的状态保持简单。
-
您永远不会从 ListBox 中删除项目,那么除了不断增长的内存消耗,您还能期待什么?
-
除此之外,您通过直接创建 ListBoxItems(它们是“容器”)来绕过项目容器的虚拟化和回收。您应该改为创建 数据项(例如此处的字符串)并将 ListBox 的
ItemTemplate属性设置为适当的 DataTemplate。然后将 ListBox 的ItemsSource属性绑定到ObservableCollection<string>,并向该集合添加/删除消息字符串。从这里开始阅读:Data Templating Overview
标签: c# wpf xaml memory-leaks listbox