【WPF.NET开发】优化性能:其他建议

本文内容

  1. 画笔的不透明度与元素的不透明度
  2. 导航到对象
  3. 对大型 3D 图面进行命中测试
  4. CompositionTarget.Rendering 事件
  5. 避免使用 ScrollBarVisibility=Auto
  6. 配置字体缓存服务以缩短启动时间

本主题提供其他的性能改进建议。

1、画笔的不透明度与元素的不透明度

使用 Brush 设置元素的 Fill 或 Stroke 时,最好设置 Brush.Opacity 值而不是设置元素的 Opacity 属性。 修改元素的 Opacity 属性可能会导致 WPF 创建一个临时表面。

2、导航到对象

NavigationWindow 对象派生自 Window 并通过内容导航支持扩展它,主要是通过聚合 NavigationService 和日志。 可以通过指定统一资源标识符 (URI) 或对象来更新 NavigationWindow 的工作区。 以下示例演示了这两种方法:

复制代码
private void buttonGoToUri(object sender, RoutedEventArgs args)
{
    navWindow.Source = new Uri("NewPage.xaml", UriKind.RelativeOrAbsolute);
}

private void buttonGoNewObject(object sender, RoutedEventArgs args)
{
    NewPage nextPage = new NewPage();
    nextPage.InitializeComponent();
    navWindow.Content = nextPage;
}

每个 NavigationWindow 对象都有一个日志,用于记录用户在该窗口中的导航历史记录。 日志的作用之一是允许用户回溯他们执行的步骤。

使用统一资源标识符 (URI) 进行导航时,日志仅存储统一资源标识符 (URI) 引用。 这意味着,每次重新访问该页时都会动态地重新构造该页,根据页面的复杂程度,此过程可能会非常耗时。 在这种情况下,虽然占用的日志存储较少,但用于重建该页的时间可能会较长。

使用对象进行导航时,日志会存储对象的整个可视化树。 这意味着,每次重新访问该页时,无需重新构造即可立即呈现该页。 在这种情况下,虽然占用的日志存储较多,但重建页面所用的时间较短。

使用 NavigationWindow 对象时,需要记住日志支持如何影响应用程序的性能。

3、对大型 3D 图面进行命中测试

就 CPU 消耗而言,对大型 3D 图面进行命中测试是一项非常占用资源的操作。 3D 图面显示动画效果时更是如此。 如果不需要对这些图面进行命中测试,请禁用命中测试。 派生自 UIElement 的对象可以通过将 IsHitTestVisible 属性设置为 false 来禁用命中测试。

4、CompositionTarget.Rendering 事件

CompositionTarget.Rendering 事件导致 WPF 持续进行动画处理。 使用此事件时,应尽可能将其分离。

5、避免使用 ScrollBarVisibility=Auto

尽可能避免对 HorizontalScrollBarVisibility 和 VerticalScrollBarVisibility 属性使用 ScrollBarVisibility.Auto 值。 这些属性针对 RichTextBox、ScrollViewer 和 TextBox 对象定义,并作为 ListBox 对象的附加属性。 而是将 ScrollBarVisibility 设置为 Disabled、Hidden 或 Visible。

Auto 值适用于空间有限且仅在必要时才应显示滚动条的情况。 例如,与包含数百行文本的 TextBox 相比,将此 ScrollBarVisibility 值用于包含 30 项的 ListBox 可能很有用。

6、配置字体缓存服务以缩短启动时间

WPF 字体缓存服务在 WPF 应用程序之间共享字体数据。 如果该服务尚未运行,则你运行的第一个 WPF 应用程序将启动该服务。 如果你使用的是 Windows Vista,可以将"Windows Presentation Foundation (WPF) 字体缓存 3.0.0.0"服务从"手动"(默认)设置为"自动(延迟启动)",以减少 WPF 应用程序的初始启动时间。

相关推荐
学以智用2 小时前
.NET 10 完整详解
.net
玩泥巴的3 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
黄俊懿7 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
cpp_w8 小时前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet9 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong1239 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
做个文艺程序员9 小时前
MQ第12篇:AI原生消息架构演进:从MQ到事件驱动的全链路设计
架构·消息队列·wpf·事件驱动架构·ai-native·cqrs
步步为营DotNet9 小时前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
CCblandy19 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构