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

浙公网安备 33010602011771号