优化性能:其他建议
本主题提供优化 WPF 应用程序性能这一节中各主题内容之外的性能改进建议。
本主题包含以下各节:
画笔的不透明度与元素的不透明度
导航到对象
对大型三维图面进行命中测试
CompositionTarget.Rendering 事件
避免使用 ScrollBarVisibility=Auto
配置字体缓存服务以缩短启动时间
画笔的不透明度与元素的不透明度
在使用 Brush 设置元素的 Fill 或 Stroke 时,设置 Brush.Opacity 值比设置元素的 Opacity 属性效果要好。 修改元素的 Opacity 属性会导致 WPF 创建临时图面。
导航到对象
NavigationWindow 对象派生自 Window 并用内容导航支持对其进行了扩展,这主要是通过聚合 NavigationService 与日记完成的。 通过指定uniform resource identifier (URI) 或对象,您可以更新 NavigationWindow 的工作区。 下面的示例演示了这两种方法:
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
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 对象都有一个日记,其中记录了用户在该窗口中的导航历史记录。 日记的作用之一便是用户可通过它回溯他们执行的步骤。
当您使用uniform resource identifier (URI) 导航时,日记只存储uniform resource identifier (URI) 引用。 这意味着,每当您重新访问该页时都会动态地重新构造该页。根据页面的复杂程度,此过程可能会非常耗时。 在这种情况下,虽然占用的日记存储较少,但用于重建该页的时间可能会较长。
当您使用对象进行导航时,日记会存储对象的整个可视化树。 这意味着,每当您重新访问该页时,无需重新构造即可立即呈现该页。 在这种情况下,虽然占用的日记存储较多,但重建页面的时间却较短。
使用 NavigationWindow 对象时,您需要记住日记支持是如何对应用程序的性能造成影响的。 有关更多信息,请参见导航概述。
对大型三维图面进行命中测试
就 CPU 占用率而言,对大型三维图面进行命中测试是一项非常占用资源的操作。 这在三维图面具有动画效果时更是如此。 如果不需要对这些图面进行命中测试,请禁用命中测试。 通过将 IsHitTestVisible 属性设置为 false,派生自 UIElement 的对象可以禁用命中测试。
CompositionTarget.Rendering 事件
CompositionTarget.Rendering 事件可使 WPF 连续显示动画效果。 使用此事件时,应尽量将其分离。
避免使用 ScrollBarVisibility=Auto
应尽量避免对 HorizontalScrollBarVisibility 和 VerticalScrollBarVisibility 属性使用 ScrollBarVisibility.Auto 值。 这些属性是为 RichTextBox、ScrollViewer 和 TextBox 对象定义的,并且定义为 ListBox 对象的附加属性。 应改为将 ScrollBarVisibility 设置为 Disabled、Hidden 或 Visible。
Auto 值适用于空间有限且只应在必要时才显示滚动条的情况。 例如,与具有数百行文本的 TextBox 相比,在具有 30 个项目的 ListBox 中使用此 ScrollBarVisibility 值可能会更为有用。
配置字体缓存服务以缩短启动时间
WPF 字体缓存服务负责在 WPF 应用程序之间共享字体数据。 如果该服务尚未运行,则运行第一个 WPF 应用程序时将启动此服务。 如果您使用的是 Windows Vista,则可以将“Windows Presentation Foundation (WPF) 字体缓存 3.0.0.0”服务从“手动”(默认值)设置为“自动(延迟的启动)”,以缩短 WPF 应用程序的初始启动时间。