WPF 性能优化建议

2023-10-26

本章讲述:WPF 性能优化建议

20180930 WPF性能优化问题:运行软件发现CPU使用率很大(80%-95%),程序中含有委托,线程,定时器的处理,之前优化时,主要优化线程和定时器相关线程方面的处理,但是效果甚微;

无意间看到博客中说程序界面中使用了投影效果会造成CPU使用率高,就试着修改,没想到,软件运行稳定后CPU使用率下降到了30%左右。

现整理一下WPF性能优化建议:

1、尽量不使用DropShadowEffect投影效果,消耗资源很大;

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

3、尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,减小开销;

4、少用Margin Padding尤其避免嵌套使用;

5、尽量使用Static Resources不用DynamicResource;

6、计时尽量使用DispatcherTimer替代Timer;

7、自定义控件尽量从轻量级的控件继承;

8、需要绑定的属性设置为DependencyProperty的依赖项属性效率要高很多,不要自己写继承自INotifyPropertyChanged的属性:http://www.codeproject.com/Articles/62158/DependencyProperties-or-INotifyPropertyChanged

9、文字少的时候用TextBlock或者label,长的时候用FlowDocument;

10、绑定的字符串用Textblock;不用label;

11、如果正在绘制的内容需要频繁地重新绘制,考虑设置各Uelement对象的CacheMode="BitmapCache";

12、避免使用 Run 来设置文本属性:(MSDN)

   <TextBlock>
      <Run FontWeight="Bold">Hello, world</Run>
    </TextBlock>
    <TextBlock FontWeight="Bold">
      Hello, world
    </TextBlock>

13、尽量不要过分依赖使用值转换器;尽量少使用第三方类库;尽量不要设置控件Opacity属性,而用Visibility

14、加快WPF程序的启动速度:

    (1).减少需要显示的元素数量,去除不需要或者冗余的XAML元素代码.

    (2).使用UI虚拟化,只显示当前需要显示的元素.

    (3).不要把不要显示的自定义控件隐藏在主界面中,虽然它们不会显示出来,但是程序启动时还是会去计算自定义控件所需的空间和位置.

15、 耗时操作放在放在非UI线程上处理,保持UI的顺畅。处理完成后如果需要在UI上展示,调用Dispatcher.BeginInoke()方法。更多内容参考WPF QuickStart系列之线程模型(Thread Model);

16、关于Data Binding,根据实际情况对Binding指定不同的Mode,性能OneWay优于TwoWay。另外修正掉系统中Binding错误,可以在Visual Studio的输出日志中查找System.Windows.Data Error;

17、Resources: 系统资源,通常情况下我们会把样式资源都统一到App.xaml中,这是很好的,便于资源的管理。不过尽量把多次重复用到的资源放到App.xaml中。例如某些页面的资源只会在当前页面中使用到,那么可以把资源定义在当前页面; 如非必要,不要使用DynaicResource,使用StaticResource即可;

18、对Item类型控件重写时,使用VirtualizingStackPanel作为ItemPanel,这样列表资源可以只渲染当前需要的内容。不过如果设置CanContextScrol="True"会阻止虚拟化,另外使用VirtualizingStackPanel时,可以设置VirtualizingStackPanel.VirtualizationMode="Recycling", 这样已经显示过的列表不会被重复创建和释放掉。

19、尽量少的使用Animation,尤其在程序启动时,Animation渲染时会占用一些CPU资源。

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

WPF 性能优化建议 的相关文章

  • 如何在 WPF 窗口中显示屏幕保护程序的预览

    我希望能够在 WPF 窗口内显示屏幕保护程序的预览 使用容器或控件或 我知道Windows本身将 p 参数传递给屏幕保护程序以获取预览 但是如何在 WPF 应用程序中显示该预览呢 我应该获取它的句柄并将其父级更改为我的容器或控件吗 如何 您
  • MVVM 层次结构中的更改通知

    假设在某个抽象 ViewModel 基类中 我有一个普通的旧属性 如下所示 public Size Size get return size set size value OnPropertyChanged Size 然后 我创建一个更具体
  • 如何访问 ItemsControl 的子项?

    如果我有一个源自ItemsControl 我可以访问它的子集合 以便我可以循环它们来执行某些操作吗 我目前似乎找不到任何简单的方法 类似的解决方案Seb s https stackoverflow com a 1000438 3195477
  • 在 ScrollViewer 中移动对象

    我正在为我的应用程序使用 MVVM 设置 并使用滚动查看器来滚动地图 在这张地图上 我有一个单位 当我选择它时我想移动它 但是 当我选择该单元时 我的 ScrollViewer 仍然处于激活状态 有没有办法解决滚动查看器或停用它 以便我可以
  • 在哪里可以找到列出控件中所有状态的属性?

    我正在查看 winrt 项目的模板 它的后退按钮具有以下样式
  • 当 Button.CommandProperty 为 null 时如何禁用按钮

    简短说明 Button CommandProperty 绑定到 ViewModel 的 SomeObject SomeCommand 属性 当 SomeObject 的 SomeCommand 属性设置为 null 或整个 SomeObje
  • 是否应该始终使用 UseLayoutRounding 和 SnapsToDevicePixels?

    在我的其他 无关 question https stackoverflow com questions 4162327 displaying errors having controls after to move downwards Me
  • 如何在WPF中启动其他程序,例如Windows窗体process.start

    我在 Windows 窗体中使用 process start 来启动其他程序 但现在我想使用 wpf 来启动它 但我不知道如何以及与它等效的是什么
  • 如何将 wpf 树视图与不同类型的嵌套对象一起使用

    我想在树视图中显示两个类 在我的主窗口中 我有某种类型对象的可观察集合 将其称为对象 a 对象 a 包含另一种类型的对象 对象 b 的可观察集合 每个对象 b 包含对象 b 的可观察集合 例如 我可能有类似这样的东西 对象A的列表 对象A1
  • WPF中如何聚焦ListviewItem?

    I have ListBox在我的包含十个项目的应用程序中 用户一次可以看到五个项目 有时我会从代码中选择项目并设置焦点 当项目可见时 选择项目并聚焦效果非常好Form 但对于其他不可见的项目 我无法设置焦点 注意 选择后对用户可见 有人可
  • 如何让 XAML 中的图像显示为实际大小?

    我有一个27 x 27我在 WPF 中显示的像素图像 但它显示larger比大小window 如何让它显示实际尺寸 替代文本 http www deviantsart com upload m20dk6 png http www devia
  • WPF 上下文菜单设计。如何在WPF菜单项中设置背景?

    我创建这样的弹出菜单
  • 如何在 MVVM 视图模型中指定资源?

    假设我想显示对象列表 其中每个对象应该有一个名称和一个合适的图像 例如带有图标的菜单项 或带有文本和图像的按钮 所有示例和程序都将视图模型中的图像公开为 PNG 文件的路径 然后绑定Source of an Image对此 但是如果我想使用
  • 将静态对象添加到资源字典中

    我有一个在多个视图中引用的类 但我希望它们之间只共享该类的一个实例 我已经像这样实现了我的课程 using System public class Singleton private static Singleton instance pr
  • WPF C# - 计时器倒计时

    如何在用 WPF C 编写的代码中实现以下内容 我有一个 ElementFlow 控件 在其中实现了 SelectionChanged 事件 该事件 根据定义 在控件的项目选择发生更改时触发特定事件 我想要它做的是 启动计时器 如果计时器达
  • WPF - 将鼠标悬停在另一个元素上时隐藏元素

    网格中有一些元素 我想要的只是当鼠标悬停在矩形上时显示 隐藏按钮
  • 图像调整大小性能:System.Drawing 与 System.Windows.Media

    我遇到了需要调整大量图像大小的情况 这些图像目前在文件系统上存储为 jpg 文件 但我希望稍后在项目中内存中只有 byte 源图像大小是可变的 但输出应该是 3 个不同的预定大小 应保留长宽比 用空白填充原始图像 即 将调整非常高的图像大小
  • 单元测试“混合”WPF/Silverlight 控件

    我正在启动一个新的 WPF Silverlight 自定义控件项目 并希望对此进行单元测试 但是我对如何解决这个问题有点困惑 此控件将基于 WPF 和 Silverlight 的相同代码库 并使用 ifs 和部分类进行少量分叉以消除差异 我
  • 使用 Process.Start() 启动后等待 WPF 应用程序加载

    我有一个 WinForms 应用程序 它启动一个运行的 wpf 进程Process Start 我想知道 WPF 进程何时完成加载并且我可以访问process MainWindowHandle属性 在完全加载之前其值为 0 我尝试轮询 但句
  • 使窗口在特定边界内可拖动 WPF

    我有一个 wpf 子窗口 允许使用 DragMove 方法进行拖动 但是 我需要允许仅在其父窗口控件的范围内拖动窗口 谁能建议一种方法来实现这一目标 谢谢 有两种方法可以做到这一点 Using 地点已结束 http msdn microso

随机推荐

  • 软件工程技术--第四章 概要设计

    第四章 概要设计 4 1 软件设计概述 4 1 1 软件设计的概念与重要性 软件设计是软件工程的重要阶段 是一个将软件需求转换为软件表示的过程 软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务 即确定系统的物理模型 解
  • EXCEL 数字统一转换成文本

    将excel中的数字统一转换成文本形式 即添加 1 点击数据 分列 2 分隔符号 下一步 3 选择文本识别符号 如 分号 4 选中文本 完成 转载于 https www cnblogs com vicdream p 4604012 html
  • 合宙 ESP32C3 使用micropython 驱动配套0.96寸 TFT ST7735 屏幕显示色块和文字

    合宙的esp32c3 开发板配套了0 96寸屏幕驱动板 可直接使用如下链接的代码 注意替换对应的pin脚和st7735 py文件 1 想显示色块参考如下链接 链接 合宙esp32c3 合宙air101LCD屏幕跑通microPython 2
  • hbase面试题(6)

    1 HBase来源于哪篇博文 C BigTable 2 下面对HBase的描述哪些是正确的 B C D B 是面向列的 C 是分布式的 D 是一种NoSQL数据库 3 HBase依靠 存储底层数据 A A HDFS B Hadoop C M
  • SAR目标检测数据集汇总

    SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1 MSTAR 1996 2 OpenSARShip2 0 2017 3 SSDD SSDD 2020 4 AIR SARShip2 0 2019 5 SAR Ship Data
  • VScode调试php文件(详细且简单易操作)

    之前也不懂 看了网上好多帖子 按照它们步骤操作一遍之后 还是不行 头都大了 现在懂了 原来几步就搞定了 被它们搞得这么复杂 又是配置这个文件 又是配置那个文件 1 下载XAMPP Download XAMPP apachefriends o
  • Java程序员面试常问试题大全

    Java程序员面试常问试题大全 1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方
  • 详解 cryptogen 的内容和配置

    目录 1 cryptogen 模块命令说明 2 cryptogen 模块的配置文件 3 cryptogen 实例 创建测试配置文件 4 Fabric 证书文件的结构 cryptogen 模块主要用来生成组织结构和账号相关的文件 任何 Fab
  • 【react】实现数据双向绑定之不用柯里化的方式

    直接给onChange事件绑定一个箭头函数 这个箭头函数的参数就是event 在箭头函数内再调用saveFormData方法 saveFormData方法里面this setState dataType value
  • 学Python该看什么书?12本精华好书推荐!

    为了让更多想通过看书来学习Python的人能够把时间花在刀刃上 小编总结了Python目前所有热门方向上我个人觉得性价比很高 值得一看的书籍 今天小编来分享给大家 一 Python新手入门 新手学Python的话我推荐这本 Python编程
  • java:面向对象(多态中成员的特点)。

    这次我们说说多态中成员的特点 我们写这样一个代码 class Fu void method1 System out println fu method1 void method2 System out println fu method 2
  • 秒解小米bl锁 无需等待时间_小米全新系统曝光:小米9推送Android Q体验版

    点击上方蓝字订阅每日最新国产手机资讯 对于米粉来说 MIUI系统是他们坚持使用小米手机的重要原因 就在今天上午 MIUI官方微博发布消息 小米9的MIUI Android Q Beta优先体验版现已推送 已获得测试资格的朋友可以升级体验 据
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include
  • 浅谈 Python中if __name__ == ‘__main__‘:的工作原理

    为了理解if name main 的工作原理 我们需要先了解Python中的特殊变量 name 每个Python模块都有一个内置的变量 name 这个变量的值取决于如何执行模块 如果模块是被直接运行的 例如 你使用命令python mysc
  • 「网络安全」如何搭建MySQL恶意服务器读取文件?

    前言 注 本文不涉及对MySQL协议报文研究 仅讲解原理 并且做部分演示 搭建MySQL恶意服务器读取文件这件事 虽然直接利用门槛较高 但是由于在网上看到了一种比较新颖的利用方式 利用社会工程学引诱用户连接MySQL进而读取用户文件 个人觉
  • Day【4】字符串解码

    原题链接 思路 对于字符串k encoding 对于这样的形式 我们要加encoding重复k次 从左向右扫描字符串 如果说遇见字符 就直接将该字符添加到结果中 如果说 遇见 k encoding 的形式 我们首先要做的是就是将k和enco
  • GCC参数详解

    gcc and g 分别是gnu的c c 编译器 gcc g 在执行编译工作的时候 总共需要4步 1 预处理 生成 i的文件 预处理器cpp 2 将预处理后的文件不转换成汇编语言 生成文件 s 编译器egcs 3 有汇编变为目标代码 机器代
  • 9.OB4.0调用存储过程通过临时表返回多行记录

    MYSQL存储过程返回多行 1 表数据准备 drop table if exists t1 drop table if exists t2 drop table if exists t3 create table t1 id varchar
  • 任何程序都必须加载到什么中才能被cpu执行

    任何程序都必须加载到内存中才能被cpu执行 内存是计算机中的重要部件之一 它是外存与cpu进行沟通的桥梁 计算机中所有程序的运行都在内存中进行 内存性能的强弱影响计算机整体发挥的水平 任何程序都必须加载到内存中才能被cpu执行 学习视频分享
  • WPF 性能优化建议

    本章讲述 WPF 性能优化建议 20180930 WPF性能优化问题 运行软件发现CPU使用率很大 80 95 程序中含有委托 线程 定时器的处理 之前优化时 主要优化线程和定时器相关线程方面的处理 但是效果甚微 无意间看到博客中说程序界面