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