WPF 防止卡顿

使用VirtualizingPanel控件
<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

  

异步编程

public async Task LoadDataAsync()
{
    var data = await Task.Run(() => LoadDataFromDatabase());
    Dispatcher.Invoke(() => UpdateUI(data));
}

  

优化资源加载

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/Images/LargeImage.png");
image.CacheOption = BitmapCacheOption.OnLoad; // 缓存选项
image.CreateOptions = BitmapCreateOptions.DelayCreation; // 延迟创建
image.EndInit();

  

按钮卡顿:

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Run(() =>
    {
        for (int i = 0; i < 200; i++)
        {
            Thread.Sleep(10);
            label1.Text = $"{DateTime.Now.ToString("yyyy-MM-dd:mm:HH:ss.fff")} i的值为 {i}";
        }
    });
}

原理说明
接下来,我们详细阐述一下原理:

BeginInvoke 方法是一个异步方法,它允许通过委托在控件的 UI 线程上异步执行代码,new Action() 是一个简单的匿名方法,将会在UI线程上执行,当UI线程空闲时,该方法将会被异步调用。

使用 BeginInvoke 的好处是,即使在执行长时间运行的操作时,也不会阻塞 UI 线程。这意味着用户仍然可以与应用程序进行交互,并且应用程序的响应性不会受到影响。

当调用 BeginInvoke 时,系统会将任务添加到 UI 线程的消息队列中。一旦消息队列中没有正在执行的任务,UI 线程就会从消息队列中获取下一个任务并执行它。这样,UI 线程就可以在需要执行的任务之间快速切换,从而保持应用程序的响应性和流畅性。


WPF ItemsControl 卡顿 数据量大 虚拟化 优化:

<ItemsControl ItemsSource="{Binding MemberList}"
              VirtualizingStackPanel.IsVirtualizing="True" 
              VirtualizingStackPanel.VirtualizationMode="Recycling"        
              VirtualizingPanel.CacheLength="50">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel></VirtualizingStackPanel>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
</ItemsControl>

 

WPF 加载数据库防止卡顿: 

public async Task LoadDataAsync()
{
    var data = await Task.Run(() =>
    {
        // 这里执行数据库查询
        return DbContext.YourEntities.ToList(); // 假设这是一个耗时的数据库操作
    });
 
    // 更新UI
    Dispatcher.Invoke(() =>
    {
        // 更新绑定的数据源等
        MyDataCollection = data;
    });
}

  

WPF页面初始化慢的问题解决:

 

this.Dispatcher.Invoke(new Action(()=>{
//分批加载控件的方法
}),System.Windows.Threading.DispatcherPriority.ApplicationIdle);

  

参考:

WPF频繁更新UI卡顿问题

https://www.cnblogs.com/guchen33/p/18263124

https://blog.51cto.com/u_16126006/6334218

WPF图片异步加载,提升UI响应速度的7大技巧

https://wenku.csdn.net/column/3q7sich6t3

posted @ 2025-08-23 11:27  microsoft-zhcn  阅读(18)  评论(0)    收藏  举报