本文内容
- 画笔的不透明度与元素的不透明度
- 导航到对象
- 对大型 3D 图面进行命中测试
- CompositionTarget.Rendering 事件
- 避免使用 ScrollBarVisibility=Auto
- 配置字体缓存服务以缩短启动时间
本主题提供其他的性能改进建议。
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 应用程序的初始启动时间。