WPF ListBox虛擬化


在ListBox加載大量數據的情況下,如果不進行虛擬化,內存將逐漸增大,長時間運行后將造成卡頓
所以需要虛擬化
寫法

<ListBox x:Name="listBox" VirtualizingStackPanel.VirtualizationMode="Recycling"  VirtualizingStackPanel.IsVirtualizing="True">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate >
            <VirtualizingStackPanel  Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

VirtualizationMode包括RecyclingStandard

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

示例代碼

VirtualizingListBox


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM