在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 列表開啟虛擬化的方式