罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

news2024/11/15 12:39:59

在上文中(点击这里回顾>>),我们主要介绍了针对三个技术的WPF应用程序性能提升,本文将着重介绍针对DevExpress WPF界面控件研发的应用程序如何提升性能!

有用控件推荐~DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。

DevExpress WPF v22.2正式版下载(Q技术交流:674691612)

4. RibbonPage延迟加载

如果您的应用程序包含带有多个项的DevExpress Ribbon控件,按需加载页面可以帮助应用减少启动时间。

要启用延迟RibbonPage项加载,请将RibbonPage的RibbonPageGroups移动到GroupCollectionTemplate。

<dxr:RibbonControl RibbonStyle="Office2019">
<dxr:RibbonDefaultPageCategory>
<dxr:RibbonPage Caption="File">
<!-- ... -->
</dxr:RibbonPage>
<dxr:RibbonPage Caption="Home">
<dxr:RibbonPage.GroupCollectionTemplate>
<DataTemplate>
<ItemsControl>
<dxr:RibbonPageGroup Caption="File">
<dxb:BarButtonItem ... />
<dxb:BarButtonItem ... />
</dxr:RibbonPageGroup>
</ItemsControl>
</DataTemplate>
</dxr:RibbonPage.GroupCollectionTemplate>
</dxr:RibbonPage>
</dxr:RibbonDefaultPageCategory>
</dxr:RibbonControl>
5. 对于“重型”UI元素使用LoadingDecorator

由于WPF在主线程中使用UI,整个窗口将保持冻结状态,直到所有元素都被加载,DevExpress LoadingDecorator允许开发者异步加载独立的UI部分:

通过执行这个策略,您的应用程序可以在屏幕上加载“较重”的元素之前显示“较轻”的UI元素。在上面的动画中,我们将视图的右侧部分封装在LoadingDecorator中,以首先显示轻量级导航菜单,只有当它完全加载时才会显示正确的部分:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<dxa:AccordionControl>
<!--...-->
</dxa:AccordionControl>
<dx:LoadingDecorator Grid.Column="1">
<dxdo:DockLayoutManager>
<!--...-->
</dxdo:DockLayoutManager>
</dx:LoadingDecorator>
</Grid>
6. 选择时的缓存选项卡

如果应用程序使用选项卡接口,则可以使用不同的选项卡缓存模式对性能进行微调。此功能可在WPF Tab控件(DXTabControl)和WPF DockLayoutManager (当使用选项卡文档组或LayoutGroups时)中使用。

默认情况下,选项卡不缓存,这对于初始启动很好。但是如果您决定第二次打开同一选项卡,其内容将再次加载。若要使用先前加载的元素,请在选择后缓存选项卡。此操作由TabContentCacheMode属性控制(对于DXTabControl, LayoutGroup和DocumentGroup),将TabContentCacheMode设置为cachetabsonselection来启用此策略。

如果选项卡切换比启动性能更重要,您可以将TabContentCacheMode设置为CacheAllTabs。在这个实例中,所有选项卡都将与第一个选项卡一起加载和缓存,这可能会显著增加视图加载时间,但其他选项卡将切换得更快,即使是第一次打开它们。

7. 按需加载数据

虽然应用程序可能处理大量数据,但用户可能不需要一次性查看所有数据。许多WPF控件允许您按需加载数据,以下DevExpress WPF组件支持虚拟化/按需数据加载:

  • GridControl
    服务器模式/即时反馈
    虚拟源

  • ComboBoxEdit, LookUpEdit, ListBoxEdit
    服务器模式/即时反馈

  • TreeListControl
    异步获取节点

  • PivotGridControl
    数据库服务器模式

  • SchedulerControl
    按需加载数据

8. 预加载主题资源

DevExpress组件包含主题使用的许多XAML资源,当一个组件第一次显示时,WPF解析所有这些资源。您可能已经注意到,第二次显示相同的控件所花费的时间要少得多,即使该控件之前在不同的视图中显示。

DevExpress主题允许您在组件显示在屏幕上之前部分加载主题资源,虽然这不会加快主视图的速度,但所有子视图都会更快地打开,您可以使用下面的代码来实现这个策略:

using DevExpress.Xpf.Core;

public partial class App : Application {
protected async override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
await ThemeManager.PreloadThemeResourceAsync("Office2019Colorful");
}
}

如果您的应用程序使用启动画面,您可以在其中预加载主题资源。

9. 使用性能分析器来检测问题

View/ViewModel初始化中的某些操作可能会产生不必要的启动延迟,如果您与远程服务同步通信、处理大文件或在View/ViewModel构造函数中执行其他资源密集型操作,则可能发生这些延迟。

Visual Studio包含一个内置的性能分析器,以帮助确定与性能相关的问题的确切原因。要发现耗时的操作,请遵循以下步骤:

(1)在Visual Studio中跳转到Debug -> Performance Profiler。

(2)选择CPU Usage复选框然后单击Start。

(3)当应用程序加载时,单击Stop Collection来在分析选项卡中查看CPU使用数据,分析器将自动突出显示有问题的方法。

您可以单击各个方法导航到详细的调用树。

正如您可以从上面的图像(取自测试应用程序)中看到的,ProcessData方法(由ViewModel构造函数调用)消耗了大量的资源,解决此问题的一种方法是异步处理操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL的学习心得和知识总结(一百二十三)|深入理解PostgreSQL数据库开源扩展pg_dirtyread的使用场景和实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

大彩 串口屏

资料下载 视频 屏幕程序创建 创建 主界面设置 实现按钮和文本的添加&#xff0c;实现画面的切换 下面注释4有点问题&#xff0c;切换画面还是会下传指令集&#xff0c;只是无法在软件中进行指令集的设置了 按钮界面 首先第一步同上添加背景图片&#xff0c;然后添加…

性能VS功能,同为测试又有哪些不一样?

我们在求职的时候&#xff0c;发现有的是招聘的功能测试&#xff0c;有的招聘的是性能测试&#xff0c;那么功能测试和性能测试的区别是什么呢&#xff1f; 侧重点不同 功能测试的侧重点是功能是否满足客户需求。 比如说我们拿到一个节假日搞活动的需求&#xff0c;这个需求…

【订阅】订阅MySql集简云连接器同步报销审批数据至MySql数据库

方案场景 企业在实现数字化转型的道路上&#xff0c;因企业多个系统孤立数据割断&#xff0c;数据互通成为企业率先解决的最大问题&#xff0c;依靠钉钉OA审批&#xff0c;企业通过审批后手动录入到企业的自建系统&#xff0c;然后再同步到MySQL数据库&#xff0c;这种方式不仅…

WPF MVVM系统入门-下

WPF MVVM系统入门-下 CommandManager 接上文WPF MVVM系统入门-上&#xff0c;我们想把Command放在ViewModel中&#xff0c;而不是Model中&#xff0c;可以将CommandBase类改为 public class CommandBase : ICommand {public event EventHandler? CanExecuteChanged{add { C…

[Verilog硬件描述语言]程序设计语句

目录一、数据流建模二、行为级建模2.1 应用场景2.2 initial过程语句2.3 always过程语句2.3.1 电平敏感信号&#xff1a;2.3.2 边沿敏感信号&#xff1a;2.3.3 initial和always语句使用注意2.4 例题&#xff1a;用always过程语句描述4选1数据选择器2.5 例题&#xff1a; 用alway…

2023-02-16:干活小计

数学公式表示学习&#xff1a; 大约耗时&#xff1a;2 hours 在做了一些工作后重读论文&#xff1a;MathBERT: A Pre-Trained Model for Mathematical Formula Understanding 这是本篇论文最重要的idea&#xff1a;Current pre-trained models neglect the structural featu…

魔百和M401A刷入Armbian系统EMMC开启wifi

文章目录一、Armbian系统写入U盘二、U盘内uEnv.txt文件修改三、盒子从U盘进行启动四、设置用户名和密码五、Armbian系统写入EMMC六、 重启系统reboot(不可以拔U盘)七、盒子关机拔出U盘八、插入USB无线网卡&#xff0c;连接wifi上次盒子刷了5.15版本的armbian系统&#xff0c;可…

C++ map和set

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 3.2 map 3.2.1 map的介绍 3.2.2 map的使用 3.3 multiset 3.3.1 multiset的介绍 3.3.2 multiset的使用 3.4 multimap 3.4.1 multimap的介绍 3.5 在OJ中的使用 4.…

Android框架源码分析-浅析OkHttp3

浅析OkHttp3 这篇文章主要用来回顾Okhttp3源码中&#xff0c;同步异步请求的区别、拦截器的责任链模式、连接池管理以及探讨socket通信到底在哪里实现。 列出的代码可能删掉了非核心部分的展示&#xff0c;如果有异议请查看源码 连接池涉及知识&#xff1a;可能根据 IP 地址…

iis7.5应用程序池的启动模式设置

最近发现公司的网站第一次登录时比较慢&#xff0c;甚至有超时的时候&#xff0c;当我检查应用程序池(IIS 7.5)时&#xff0c;应用程序池正常启动&#xff0c;但有时候处于停止状态&#xff0c;停止原因未知。所以必须第一时间重新启动它&#xff0c;以保证网站能被正常访问。于…

kubeadm Dashboard harbor

主机名IP地址安装组件master01192.168.186.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.186.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.186.30docker、kubeadm、kubelet、kubectl、flannelharbor192.168.186.40docker、docker-compose、harb…

python语言基础(最详细版)

文章目录一、程序的格式框架缩进1、定义2、这里就简单的举几个例子注释二、语法元素的名称三、数据类型四、数值运算符五、关系运算六、逻辑运算七、运算符的结合性八、字符串一、程序的格式框架 缩进 1、定义 &#xff08;1&#xff09;python中通常用缩进来表示代码包含和…

Python迭代器、生成器和装饰器

一、迭代器 1、迭代器简介 迭代操作是访问集合元素的一种方式&#xff0c;是 Python最强大的功能之一。 迭代器是用来迭代取值的工具&#xff0c;是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能…

QT项目_RPC(进程间通讯)

QT项目_RPC(进程间通讯) 前言&#xff1a; 两个进程间通信、或是说两个应用程序之间通讯。实际情况是在QT开发的一个项目中&#xff0c;里面包含两个子程序&#xff0c;子程序有单独的界面和应用逻辑&#xff0c;这两个子程序跑起来之后需要一些数据的交互&#xff0c;例如&…

GEE学习笔记 八十四:【GEE之Python版教程十四】矢量数据(ee.feature)

上一节讲了几何图形Geometry&#xff0c;这一节讲矢量数据&#xff08;ee.feature&#xff09;&#xff0c;它的构成也就是几何图形以及属性字典。 1、API定义 首先看一下GEE的python版API&#xff08;Welcome to GEE-Python-API’s documentation! — GEE-Python-API 1.0 do…

【论文】智能隧道检测车的现状及改进策略

本文转载自《智慧城轨》2022年第11期 作者&#xff1a;黄丹樱1,韦强1,朱椰毅2,范骁1,林浩立1 单位&#xff1a;1 浙江师范大学工学院&#xff1b;2 浙江金温铁道开发有限公司 声明&#xff1a;本文仅用于学术分享&#xff0c;不做商业用途&#xff0c;如有侵权&#xff0c;联…

从实现到原理,聊聊Java中的SPI动态扩展

原创&#xff1a;微信公众号 码农参上&#xff0c;欢迎分享&#xff0c;转载请保留出处。 八股文背多了&#xff0c;相信大家都听说过一个词&#xff0c;SPI扩展。 有的面试官就很喜欢问这个问题&#xff0c;SpringBoot的自动装配是如何实现的&#xff1f; 基本上&#xff0c…

Redis第二讲

二、Redis02 2.1 发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 发布订阅的实现 1、打开一个客户端订阅channel1 127.0.0.1:6379> subscribe ch…

红黑树的原理+实现

文章目录红黑树定义性质红黑树的插入动态效果演示代码测试红黑树红黑树 定义 红黑树是一个近似平衡的搜索树&#xff0c;关于近似平衡主要体现在最长路径小于最短路径的两倍&#xff08;我认为这是红黑树核心原则&#xff09;&#xff0c;为了达到这个原则&#xff0c;红黑树所…