【WPF.NET开发】优化性能:布局和设计

本文内容

WPF 应用程序的设计可能会在计算布局和验证对象引用时产生不必要的开销,从而影响性能。 对象的构造会影响应用程序的性能特征,在运行时更是如此。本主题提供这些方面的性能改进建议。

Layout

"布局过程"一词描述了测量和排列 Panel(派生对象的子级集合)成员的过程,然后在屏幕中绘制它们。 布局处理过程是一个数学密集型过程,即:集合中的子级数目越多,所需的计算量就越大。 例如,每当集合中的子 UIElement 对象改变其位置时,它有可能触发布局系统的一个新的过程。 由于对象特征与布局行为之间的关系非常紧密,因此有必要了解可以调用布局系统的事件类型。 应用程序将尽可能减少不必要的布局处理过程调用,从而改善性能。

布局系统对集合中的每个子成员都完成两个处理过程:测量处理过程和排列处理过程。 每个子对象提供其自身对 MeasureArrange 方法的重写实现,从而提供其自身特定的布局行为。 简单地说,布局是一个递归系统,实现在屏幕上对元素进行大小调整、定位和绘制。

如果发生下列任一操作,将再次调用布局处理过程:

  • 向集合中添加了一个子对象。

  • LayoutTransform 将应用于子对象。

  • UpdateLayout 方法用于调用子对象。

  • 使用影响测量或排列过程的元数据进行标记的依赖属性的值发生更改时。

1、尽可能使用最高效的面板

布局过程的复杂性直接取决于 Panel(使用的派生元素)的布局行为。 例如,GridStackPanel 控件提供比 Canvas 控件更多的功能。 功能大幅度改进的代价是性能成本的大幅度提高。 但是,如果不需要 Grid 控件提供的功能,则应使用成本较低的其他控件,如 Canvas 或自定义面板。

2、更新而不替换 RenderTransform

可以更新 Transform,而不是用 RenderTransform 属性的值加以替代。 在涉及动画的方案中,尤其是这样。 通过更新现有的 Transform,可以避免启动不必要的布局计算。

3、从上到下生成树

在逻辑树中添加或删除节点时,会在该节点的父级及其所有子级上引起属性失效。 因此,应始终遵循从上到下的构造模式,以避免由于在经过验证的节点中出现不必要的失效而付出代价。 下表显示了自上而下构建树与自下而上构建树的执行速度差异,其中树有 150 级深,并且每一级都有单一的 TextBlockDockPanel

Action 构建树(以毫秒为单位) 呈现 - 包括生成树(以毫秒为单位)
从下到上 366 454
自上而下 11 96

以下代码示例演示如何从上到下创建树。

复制代码
private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();
    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);
    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)
    {
        textBlock = new TextBlock();
        textBlock.Text = "Default";
        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();
        parentPanel.Children.Add(childPanel);
        parentPanel = childPanel;
    }
}
相关推荐
云中飞鸿1 小时前
值类型、引用类型
c#
c#上位机4 小时前
halcon窗口显示文字
图像处理·c#·halcon
kingwebo'sZone4 小时前
Datagridview 显示当前选中行
c#
智算菩萨5 小时前
【实战】使用讯飞星火API和Python构建一套文本摘要UI程序
开发语言·python·ui
时光追逐者5 小时前
一个基于 .NET 开源、功能强大的分布式微服务开发框架
分布式·微服务·开源·c#·.net·.net core
Poetinthedusk5 小时前
设计模式-命令模式
windows·设计模式·c#·wpf·命令模式
步步为营DotNet6 小时前
深入探究.NET中依赖注入(DI)的生命周期管理:构建稳健且高效的应用
.net
top_designer7 小时前
Illustrato:钢笔工具“退休”了?Text to Vector 零基础矢量生成流
前端·ui·aigc·交互·ux·设计师·平面设计
SakuraOnTheWay8 小时前
解构 JavaScript 迭代器:一行代码引发的性能思考
javascript·性能优化
csdn_aspnet8 小时前
C# 电子签名及文档存储
javascript·c#