论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
WPF性能优化示例:使用VirtualizingStackPanel提升界面 ...
WPF性能优化示例:使用VirtualizingStackPanel提升界面加载速度 ...
刘俊凯
论坛元老
|
2024-5-17 02:40:18
|
显示全部楼层
|
阅读模式
楼主
主题
1812
|
帖子
1812
|
积分
5440
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
概述:
WPF界面绑定和渲染大量数据可能导致性能问题。通过启用UI虚拟化、异步加载和数据分页,可以有效提高界面响应性能。以下是简朴示例演示这些优化方法。
在WPF中,当你尝试绑定和渲染大量的数据项时,性能问题可能出现。以下是一些可能导致性能慢的原因以及优化方法:
UI 虚拟化:
WPF提供了虚拟化技术,可以只在视口内渲染可见的元素,而不是全部渲染。这可以通过使用 VirtualizingStackPanel 或 ListView 控件来实现。
[/code][list=1]
[*][b]异步加载:[/b] 如果数据量很大,可以考虑异步加载数据,以便在后台线程中加载数据,避免主UI线程被阻塞。
[*][b]数据绑定:[/b] 避免使用复杂的数据绑定,尤其是涉及到复杂的转换器或大量计算的情况。尽量淘汰绑定的复杂度。
[*][b]数据分页:[/b] 如果可能,可以考虑将数据进行分页,只加载当前页的数据,而不是一次性加载全部数据。
[*][b]UI 元素缓存:[/b] 对于大量相似的UI元素,可以考虑使用UI元素的缓存,以避免频繁创建和销毁。
[/list]以下是一个简朴的示例,演示了使用 VirtualizingStackPanel 实现UI虚拟化的方式:
[code]<Window x:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding YourData}" VirtualizingStackPanel.IsVirtualizing="True">
</ListView>
</Grid>
</Window>
复制代码
确保你的数据绑定公道,尽量避免不必要的计算和操作。如果问题仍然存在,你可能必要使用性能分析工具,如Visual Studio的性能分析器,来深入了解性能瓶颈。
下面是一个简朴的例子,演示了在WPF中使用VirtualizingStackPanel实现UI虚拟化的方法。在这个例子中,使用ObservableCollection作为数据源,其中包含了50000个数据项。
MainWindow.xaml:
<Window x:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding YourData}" VirtualizingStackPanel.IsVirtualizing="True">
</ListView>
</Grid>
</Window><Window x:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding YourData}" VirtualizingStackPanel.IsVirtualizing="True">
</ListView>
</Grid>
</Window><Window x:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding YourData}" VirtualizingStackPanel.IsVirtualizing="True">
</ListView>
</Grid>
</Window>
复制代码
MainWindow.xaml.cs:
using System.Collections.ObjectModel;
using System.Windows;
namespace YourNamespace
{
public partial class MainWindow : Window
{
public ObservableCollection<YourItem> YourData { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
// 异步加载数据
Task.Run(() => LoadData());
}
private void LoadData()
{
YourData = new ObservableCollection<YourItem>();
// 添加50000个数据项
for (int i = 0; i < 50000; i++)
{
YourData.Add(new YourItem { Index = i, Data = $"Item {i}" });
}
// 在UI线程更新数据
Application.Current.Dispatcher.Invoke(() => YourData = YourData);
}
}
public class YourItem
{
public int Index { get; set; }
public string Data { get; set; }
}
}
复制代码
在这个例子中,YourItem是一个简朴的数据项类,包含了两个属性:Index和Data。在MainWindow的构造函数中,创建了一个包含50000个YourItem的ObservableCollection,并绑定到ListView的ItemsSource上。由于使用了
VirtualizingStackPanel.IsVirtualizing="True",ListView会对可见的项进行虚拟化,从而提高性能。
源代码获取:https://pan.baidu.com/s/1tusYETiOIvYA0aVz_swAmw?pwd=6666
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
刘俊凯
论坛元老
这个人很懒什么都没写!
楼主热帖
牛客SQL刷题第三趴——SQL大厂面试真题 ...
IDEA中集成Git操作以及关于Git中分支说 ...
MySQL ——select语句 一条龙服务 ...
SAP MM 使用两个STO实现免关税跨国公 ...
github上fork2.4k,star8.7k的这款状态 ...
Bug驱动开发探讨
袋鼠云春季生长大会最新议程来啦!4月2 ...
哈工大信息安全概论期末复习 ...
万字解析XML配置映射为BeanDefinition ...
事务
标签云
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
IOS
Oracle
登录参与点评抽奖加入IT实名职场社区
下次自动登录
忘记密码?点此找回!
登陆
新用户注册
用其它账号登录:
关闭
快速回复
返回顶部
返回列表