WPF ListBox虚拟化
在ListBox加载大量数据的情况下,如果不进行虚拟化,内存将逐渐增大,长时间运行后将造成卡顿
所以需要虚拟化
写法
<ListBox x:Name="listBox" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True">
<ListBox.ItemsPanel>
<ItemsPanelTemplate >
<VirtualizingStackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
VirtualizationMode
包括Recycling
和Standard
Recycling:重复利用
Standard:创建和丢弃容器
测试:定时向ListBox加入数据
Timer timer;
int number = 1;
timer=new Timer();
timer.Interval = 1;
timer.Elapsed += AddData;
listBox.ItemsSource = new ObservableCollection<string>();
timer.Start();
private void AddData(object sender, ElapsedEventArgs e)
{
listBox.Dispatcher.Invoke(() =>
{
number++;
var dataContext = listBox.ItemsSource as ObservableCollection<string>;
if (dataContext != null)
dataContext.Add(number.ToString());
if (listBox.Items.Count > 0)
{
listBox.ScrollIntoView(listBox.Items[listBox.Items.Count - 1]);
}
if (dataContext != null && dataContext.Count > 200)
{
dataContext.Clear();
}
});
}
参考资料
How to use UI virtualization with redefined ListBox templates
VirtualizationMode Enum
WPF 列表开启虚拟化的方式
示例代码
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的【推荐】按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。