本主题除了“ 优化 WPF 应用程序性能 ”部分中的主题介绍的性能建议外,还提供性能建议。
本主题包含以下部分:
画笔上的不透明度与元素上的不透明度
使用 Brush 来设置元素的 Fill 或 Stroke 时,最好设置 Brush.Opacity 值,而不是设置元素的 Opacity 属性。 修改元素 Opacity 的属性可能会导致 WPF 创建临时图面。
导航到对象
该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;
}
Private Sub buttonGoToUri(ByVal sender As Object, ByVal args As RoutedEventArgs)
navWindow.Source = New Uri("NewPage.xaml", UriKind.RelativeOrAbsolute)
End Sub
Private Sub buttonGoNewObject(ByVal sender As Object, ByVal args As RoutedEventArgs)
Dim nextPage As New NewPage()
nextPage.InitializeComponent()
navWindow.Content = nextPage
End Sub
每个 NavigationWindow 对象都有一个记录该窗口中用户的导航历史记录的日记。 日志的目的之一是让用户追溯他们的步骤。
使用统一资源标识符(URI)导航时,日志仅存储统一资源标识符(URI)引用。 这意味着,每次重新访问页面时,都会动态重新构造页面,这可能很耗时,具体取决于页面的复杂性。 在这种情况下,日志存储成本较低,但重新构造页面的时间可能很高。
使用对象导航时,日志将存储该对象的整个可视化树。 这意味着每次重新访问页面时,它都会立即呈现,而无需重新构造。 在这种情况下,日记存储成本很高,但重新构造页面的时间较低。
使用 NavigationWindow 对象时,需要记住日记支持对应用程序性能的影响。 有关详细信息,请参阅 导航概述。
大型 3D 表面上的碰撞检测
在大型 3D 图面上进行命中测试是一项对 CPU 资源消耗非常高的操作。 当 3D 图面进行动画处理时,这尤其如此。 如果不需要在这些表面上进行命中测试,请禁用命中测试。 派生自 UIElement 的对象可以通过将 IsHitTestVisible 属性设置为 false
禁用命中测试。
CompositionTarget.Rendering 事件
该 CompositionTarget.Rendering 事件导致 WPF 持续进行动画处理。 如果使用此事件,请在每个机会中将其分离。
避免使用“ScrollBarVisibility=Auto”
尽可能避免对HorizontalScrollBarVisibility
和VerticalScrollBarVisibility
属性使用ScrollBarVisibility.Auto值。 这些属性针对 RichTextBox对象 ScrollViewer和 TextBox 对象定义,并作为对象的附加属性 ListBox 定义。 相反,将ScrollBarVisibility设置为Disabled、Hidden或Visible。
该值 Auto 适用于空间有限且仅在必要时显示滚动条的情况。 例如,将此值 ScrollBarVisibility 与 ListBox 30 个项目(而不是 TextBox 包含数百行文本)一起使用可能很有用。
配置字体缓存服务以减少启动时间
WPF 字体缓存服务在 WPF 应用程序之间共享字体数据。 如果服务尚未运行,则运行的第一个 WPF 应用程序将启动此服务。 如果使用 Windows Vista,可以将“Windows Presentation Foundation(WPF)字体缓存 3.0.0.0”服务从“手动”(默认值)设置为“自动(延迟启动)”,以减少 WPF 应用程序的初始启动时间。