WPF性能优化经验总结

2023-11-13

原文地址:WPF性能优化经验总结 - 痴鸟 - 博客园

WPF性能优化一、Rendering Tier

1. 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tier 2的情况下也不会硬件加速。(不全,其余请查阅SDK)

WPF性能优化二、布局和设计

1.尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,越复杂性能开销越大。

2.建立逻辑树或者视觉树的时候,遵循Top-Down的原则。

WPF性能优化三、图像

1. 对Image做动画处理的时候(如调整大小等),可以使用这条语句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。

2. 用TileBrush的时候,可以CachingHint。

WPF性能优化四、对象行为

1.访问CLR对象和CLR属性的效率会比访问DependencyObject/DependencyProperty高。注意这里指的是访问,不要和前面的绑定混淆了。但是,把属性注册为DependencyProperty会有很多的优点:比如继承、数据绑定和Style。

WPF性能优化五、应用程序资源

1. 在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝。

2. 尽量使用Static Resources,但不能盲目使用。

WPF性能优化六、文本

1. 文字少的时候用TextBlock或者label,长的时候用FlowDocument.

2. 使用元素TextFlow和TextBlock时,如果不需要TextFlow的某些特性,就应该考虑使用TextBlock,因为它的效率更高。

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代价要比使用TextElement(比如Run)的代价高.在FlowDocument中尽量避免使用TextBlock,要用Run替代。

4. 在TextBlock中显式的使用Run命令比不使用Run命名的代码要高。
5. 把Label(标签)元素的ContentProperty和一个字符串(String)绑定的效率要比把字符串和TextBlock的Text属性绑定的效率低。因为Label在更新字符串是会丢弃原来的字符串,全部重新显示内容。如果字符串不需要更新,用Label就无所谓性能问题。

6. 在TextBlock块使用HyperLinks时,把多个HyperLinks组合在一起效率会更高。

7. 显示超链接的时候,尽量只在IsMouseOver为True的时候显示下划线,一直显示下划线的代码高很多

8. 尽量不使用不必要的字符串连接。

WPF性能优化七、数据绑定

1.在使用数据绑定的过程中,如果绑定的数据源是一个CLR对象,属性也是一个CLR属性,那么在绑定的时候对象CLR对象所实现的机制不同,绑定的效率也不同。

A、数据源是一个CLR对象,属性也是一个CLR属性。对象通过TypeDescriptor/PropertyChanged模式实现通知功能。此时绑定引擎用TypeDescriptor来反射源对象。效率最低。

B、数据源是一个CLR对象,属性也是一个CLR属性。对象通过INotifyPropertyChanged实现通知功能。此时绑定引擎直接反射源对象。效率稍微提高。

C、数据源是一个DependencyObject,而且属性是一个DependencyProperty。此时不需要反射,直接绑定。效率最高。

2.当一个CLR对象很大时,比如有1000个属性时,尽量把这个对象分解成很多很小的CLR对象。比如分成1000个只有一个属性的CLR对象。

3. 当我们在列表(比如ListBox)显示了一个CLR对象列表(比如List)时,如果想在修改List对象后,ListBox也动态的反映这种变化。此时,我们应该使用动态的ObservableCollection对象绑定。而不是直接的更新ItemSource。两者的区别在于直接更新ItemSource会使WPF抛弃ListBox已有的所有数据,然后全部重新从List加载。而使用ObservableCollection可以避免这种先全部删除再重载的过程,效率更高。

4. 尽量绑定IList而不是IEnumerable到ItemsControl。

WPF性能优化八、其它性能建议

1. 如果需要修改元素的Opacity属性,最后修改一个Brush的属性,然后用这个Brush来填充元素。因为直接修改元素的Opacity会迫使系统创建一个临时的Surface

2. 用NavigationWindow的时候,尽量Update the client area by object,而不是URI

3. 尽量不要使用ScrollBarVisibility=Auto

WPF性能优化一、Rendering Tier

1. 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tier 2的情况下也不会硬件加速。(不全,其余请查阅SDK)

WPF性能优化二、布局和设计

1.尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,越复杂性能开销越大。

2.建立逻辑树或者视觉树的时候,遵循Top-Down的原则。

WPF性能优化三、图像

1. 对Image做动画处理的时候(如调整大小等),可以使用这条语句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。

2. 用TileBrush的时候,可以CachingHint。

WPF性能优化四、对象行为

1.访问CLR对象和CLR属性的效率会比访问DependencyObject/DependencyProperty高。注意这里指的是访问,不要和前面的绑定混淆了。但是,把属性注册为DependencyProperty会有很多的优点:比如继承、数据绑定和Style。

WPF性能优化五、应用程序资源

1. 在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝。

2. 尽量使用Static Resources,但不能盲目使用。

WPF性能优化六、文本

1. 文字少的时候用TextBlock或者label,长的时候用FlowDocument.

2. 使用元素TextFlow和TextBlock时,如果不需要TextFlow的某些特性,就应该考虑使用TextBlock,因为它的效率更高。

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代价要比使用TextElement(比如Run)的代价高.在FlowDocument中尽量避免使用TextBlock,要用Run替代。

4. 在TextBlock中显式的使用Run命令比不使用Run命名的代码要高。
5. 把Label(标签)元素的ContentProperty和一个字符串(String)绑定的效率要比把字符串和TextBlock的Text属性绑定的效率低。因为Label在更新字符串是会丢弃原来的字符串,全部重新显示内容。如果字符串不需要更新,用Label就无所谓性能问题。

6. 在TextBlock块使用HyperLinks时,把多个HyperLinks组合在一起效率会更高。

7. 显示超链接的时候,尽量只在IsMouseOver为True的时候显示下划线,一直显示下划线的代码高很多

8. 尽量不使用不必要的字符串连接。

WPF性能优化七、数据绑定

1.在使用数据绑定的过程中,如果绑定的数据源是一个CLR对象,属性也是一个CLR属性,那么在绑定的时候对象CLR对象所实现的机制不同,绑定的效率也不同。

A、数据源是一个CLR对象,属性也是一个CLR属性。对象通过TypeDescriptor/PropertyChanged模式实现通知功能。此时绑定引擎用TypeDescriptor来反射源对象。效率最低。

B、数据源是一个CLR对象,属性也是一个CLR属性。对象通过INotifyPropertyChanged实现通知功能。此时绑定引擎直接反射源对象。效率稍微提高。

C、数据源是一个DependencyObject,而且属性是一个DependencyProperty。此时不需要反射,直接绑定。效率最高。

2.当一个CLR对象很大时,比如有1000个属性时,尽量把这个对象分解成很多很小的CLR对象。比如分成1000个只有一个属性的CLR对象。

3. 当我们在列表(比如ListBox)显示了一个CLR对象列表(比如List)时,如果想在修改List对象后,ListBox也动态的反映这种变化。此时,我们应该使用动态的ObservableCollection对象绑定。而不是直接的更新ItemSource。两者的区别在于直接更新ItemSource会使WPF抛弃ListBox已有的所有数据,然后全部重新从List加载。而使用ObservableCollection可以避免这种先全部删除再重载的过程,效率更高。

4. 尽量绑定IList而不是IEnumerable到ItemsControl。

WPF性能优化八、其它性能建议

1. 如果需要修改元素的Opacity属性,最后修改一个Brush的属性,然后用这个Brush来填充元素。因为直接修改元素的Opacity会迫使系统创建一个临时的Surface

2. 用NavigationWindow的时候,尽量Update the client area by object,而不是URI

3. 尽量不要使用ScrollBarVisibility=Auto

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF性能优化经验总结 的相关文章

  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 如何将 WPF 窗口置于前面?

    我创建了一个单实例应用程序 并且希望在用户多次启动该应用程序时激活已打开的窗口 这工作正常 但我有一个问题 如果已经打开的窗口超出了另一个应用程序窗口 我必须将其放在前面 我尝试过 window Focus 和 window Show 但它
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • ViewModel 中的 TextBox CaretIndex 属性

    是否可以通过视图中定义的 Binding 获取 设置 wpf 视图模型中 TextBox 控件的 CaretIndex 属性的值 Thanks 这里的问题是如何获得CaretIndex of the TextBox通过视图模型进行控制 如果
  • 如何更改 OxyPlot Y 轴字符串格式?

    谁能告诉我如何更改 Y 轴字符串格式 我想向 Y 轴百分比添加百分号 我正在使用 OxyPlot 在 wpf 中生成图表 这是我的尝试 但它不起作用 Func
  • 实体框架 - 绑定 WPF 树视图控件

    在服务类别表中 ParentCategoryId 是 ServiceCategoryId 它是父类别 我的类别可以有第 n 级层次结构 因此我需要使用树视图控件来呈现它 我怎样才能做到这一点 Thanks 你可以使用分层数据模板 http
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何清除 (WPF) DataGrid 中的单元格(使其获取 NULL 值)?

    我们有一个列绑定到一个可为空的 SQL 整数值 当用户尝试 清除 单元格时DataGrid 我们得到验证错误 无法转换 如何将其设置为空并将 空 值绑定到基础列 我已经用谷歌搜索了这个问题两天并找到了任何东西 我试图编辑我对 HCL 的评论
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 在后台进程中访问 WPF FlowDocument

    在后台访问 WPF FlowDocument 我的问题涉及在 WPF 后台访问 UI 对象 我见过几十个示例应用程序 它们都很简单 易于理解 其中 95 告诉你如何显示进度条 这并不是我想要的 我的问题是这样的 我想通过访问 RichTex
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 创建可重用的 WINDOW 控件

    好吧 这似乎很难 或者我错过了一些明显的东西 我想创建可重复使用的 WINDOW 它将在所有产品中使用 这意味着该控件位于 WPF Controls 程序集中 Themes Generic xaml 不是一个解决方案 我需要为窗口提供自己的
  • 简单的WPF + MVVM绑定

    我有一个名为MyWindow源自于Window 我使用 MVVM 模式 因此在代码隐藏中我有以下字段 public MyViewModel ViewModel new MyViewModel ViewModel包含一个集合Person 我想
  • WPF 4.0 InvokeCommandAction 兼容性 (System.Windows.Interactivity)

    当我在 WPF 4 0 中插入 InvokeCommandAction Blend 4 SDK 时遇到问题 用户控件未显示 并且我遇到了一些例外情况 登录底部 如果我的 xaml 代码中没有该行 就没有问题 但没有事件触发器 我已经在外部灯
  • 我的 C# .NET 团队是否应该迁移到 Windows Presentation Foundation? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • WPF KeyGestures - 绑定非字母数字键

    Should be a simple one but I can t work out how to do it Using WPF4 I want to Bind Ctrl to Zoom Out and Ctrl to Zoom In

随机推荐

  • Kafka 数据存储形式以及数据清理

    文章目录 Kafka 的存储日志 日志的观察模式 日志写入模式 日志读写模式 删除消息 数据挤压问题 数据清理 日志删除 日志压缩 在Kafka当中数据是以日志的形式存在的 Kafka 的存储日志 在Kafka当中 数据在磁盘当中的存储 K
  • 家用千兆路由器排行榜前十名_路由器哪个牌子好?千兆路由器2019排行

    现在网络宽带已经进入千兆时代 几乎很多的宽带已经免费升级到了100M以上 所以之前的百兆无线路由器已经有点落伍了 市面上也出现了很多的入门级的千兆无线路由器 区别就是如果你家的宽带在100M以内 比如80M 50M 20M 10M等 使用百
  • 取消GL.iNet路由器视频的密码

    每次路由器访问192 168 8 1 8083 action stream时总是无法访问 但是先进入192 168 8 1登录以后再去刷新视频就可以出来 即使取消外网登录验证也还是没效果 最后发现广大网友的意见是重新刷固件 先去GL iNe
  • 计算机专业毕业设计演示视频(论文+系统)_kaic

    https gongkailuxiangdu oss cn beijing aliyuncs com lx jsp 20 70912jspm E6 88 BF E5 B1 8B E9 94 80 E5 94 AE E7 AE A1 E7 9
  • 树莓派命令行显示乱码及异地组网问题

    写了一千多字没保存 很生气 这一条简写 命令行显示异常 首先检查树莓派设置里的地区 时区设置 一律改为中国 随后重要原因就是字库不全问题 命令行输入 sudo apt get install ttf way zenhei 一路确定安装字体
  • 程序的链接的三种方式

    程序的链接有以下三种方式 静态链接 在程序运行之前 先将各目标模块及它们所需的库函数链接成一个完整的可执行程序 以后不再拆开 装入时动态链接 将用户源程序编译后所得到的一组目标模块 在装入内存时 釆用边装入边链接的链接方式 运行时动态链接
  • 使用matlab进行灵敏性分析(附源代码)

    调用单纯形程序 function x z flg sgma simplexfun A A1 b c m n n1 cb xx A b are the matric in Ax b c is the matrix in max z cx A1
  • ChatGPT实现代码生成

    代码生成 就代码生成而言 ChatGPT 是一款卓越的工具 它为开发者提供强大的功能 ChatGPT 可以运用其出色的自然语言处理技术 深入理解和解释开发者的需求 快速生成适合的代码片段 对于那些繁琐的任务或者重复的代码 ChatGPT 能
  • 试题 C: 刷题统计

    题目链接 点击跳转 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛 他计划周一至周五每天做 a 道题目 周六和周日每天做 b 道题目 请你帮小明计算 按照计划他将在第几天实现做题数大于等于 n 题 输入格式 输入一行包含三个整数 a
  • 系统资源占用高排查手段

    1 cpu高排查思路 1 top d 1每秒打印进程所占cpu资源 然后再按h显示线程占用 2 strace跟踪strace p 线程号 会打印该线程主要做什么操作 2 io高排查思路 lsof是一个展现的是当前系统所有进程 不是线程 打开
  • 端午过后公司面了一个字节来的要求月薪23K,明显感觉他背了很多面试题...

    最近有朋友去字节面试 面试前后进行了20天左右 包含4轮电话面试 1轮笔试 1轮主管视频面试 1轮hr视频面试 据他所说 80 的人都会栽在第一轮面试 要不是他面试前做足准备 估计都坚持不完后面几轮面试 其实 第一轮的电话面试除了一些常规的
  • Redis数据结构——QuickList、SkipList、RedisObjective

    承接上文 本文主要介绍QuickList SkipList RedisObjective 四 Redis数据结构 QuickList 问题1 ZipList虽然节省内存 但申请内存必须是连续空间 如果内存占用较多 申请内存效率很低 怎么办
  • ObjectArx 学习笔记(一)--入口函数acrxEntryPoint

    参考资料 AutoCAD 2000 ARX二次开发实例精粹 1 Arx程序的初始化 新建完工程之后 Arx程序的初始化在acrxEntryPoint 函数的AcRx kInitAppMsg事件中 或该事件调用的函数中进行 例如InitApp
  • 【PS】高低频磨皮

    一 原理 将皮肤纹理的信息储存在高频的图层中 将皮肤颜色的信息储存在低频的图层中 从而分开皮肤的颜色和纹理 达到快速修复皮肤的效果 二 步骤 1 建立高低频图层 2 低频图层 3 高频图层 图像 应用图像 混合模式改为线性光
  • 以http协议实现onvif协议并完成对IPC摄像头的监控

    文章目录 目录 文章目录 前言 1实现http连接 2 获取设备编码参数 3 设置摄像头相关参数 总结 前言 因为工作上的原因 需要接入IPC摄像头 实现监控功能 因而开始了对于IPC摄像头的学习之路 因为要做到通用 所以目光直接锁定了on
  • python爬虫增加多线程获取数据

    Python爬虫应用领域广泛 并且在数据爬取领域处于霸主位置 并且拥有很多性能好的框架 像Scrapy Request BeautifuSoap urlib等框架可以实现爬行自如的功能 只要有能爬取的数据 Python爬虫均可实现 数据信息
  • 国产数据库产品清单

    01 提到国产数据库 圈儿内的朋友多数会说出国产数据库 四大家族 达梦 金仓 南大 神通 那么除了这四家 你还是否还了解其他的国产数据库产品 随着国内信息技术的快速发展 以及近几年去 O 的强势浪潮 在国内各数据库厂商的不断努力下 国产数据
  • 区块链实验室(14) - 编译FISCO-BCOS

    FISCO BCOS是一种区块链平台 与Hyperledger和Ethereum有些不同 详见FISCO BCOS 区块链 编译FISCO BCOS源码的目的是修改或者新增其中功能模块 进行对比实验 验证新想法 新创意的效果 编译的步骤很简
  • SQLi-Labs 学习笔记(Less 41-50)

    点击打开链接 Less 41 基于错误的POST型单引号字符型注入 先打开网页查看 Welcome Dhakkan 与之前讲的Less 40的区别 plain view plain copy sql SELECT FROM users WH
  • WPF性能优化经验总结

    原文地址 WPF性能优化经验总结 痴鸟 博客园 WPF性能优化一 Rendering Tier 1 根据硬件配置的不同 WPF采用不同的Rendering Tier做渲染 下列情况请特别注意 因为在这些情况下 即使是处于Rendering