技术开发 频道

细数改善WPF应用程序性能的10大方法

  3、增加静态资源的使用

  静态资源是预定义的资源,可以连接到XAML属性,它类似于编译时绑定,不会影响性能,另一方面,动态资源涉及到运行时查找和对象的构建,从而会影响到性能。但也需要注意,静态资源需要在编译时展示。

  静态资源的引用可以参考下面的方法:

<Button
        Template
="{StaticResource RoundButtonWithThickEdge}"
         x:Name
="button1" Content="Button 1" >
  
</Button>

 

  下面的代码片段显示了静态资源RoundButtonWithThickEdge的定义:

<ControlTemplate
       x:Key
="RoundButtonWithThickEdge"
       TargetType
="{x:Type Button}">
      
<Grid>
        
<Ellipse Fill="{TemplateBinding Background}"
           Stroke
="{x:Null}"
           HorizontalAlignment
="Stretch" x:Name="ellipse"/>
            
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                
<Ellipse Stroke="{x:Null}" Margin="2,3,4,5">
                  
<Ellipse.Fill>
                    
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                  
<GradientStop Color="#FFFBFAFA" Offset="0"/>
                  
<GradientStop Color="#1DFFFFFF" Offset="1"/>
            
</LinearGradientBrush>
          
</Ellipse.Fill>
        
</Ellipse>
      
</Grid>
    
</ControlTemplate>

 

  4、当你想显示大型数据时,使用UI虚拟化的控件

  想象一下一个组合框绑定大量行时的样子,它会让组合框中项目的展现变得非常慢,这是因为在这种情况下,程序需要计算每个项目的具体显示位置,使用WPF时,你可以延迟这个行为,这就叫做UI虚拟化,它只会在其可见范围内生产项目显示需要的容器。

  要实现这种效果,你需要将相应控件的IsVirtualizing属性设为True,例如,Listbox经常用来绑定大型数据集,它是UI虚拟化的重要候选者,其它适宜UI虚拟化的控件包括Combobox,ListView和TreeView。

  5、使用延迟滚动增强用户体验

  如果你还记得可滚动的DataGrid或ListBox,它们往往会降低整个应用程序的性能,因为在滚动时会强制连续更新,这是默认的行为,在这种情况下,我们可以使用控件的延迟滚动(Deferred Scrolling)属性增强用户体验。你需要做的仅仅是将IsDeferredScrollingEnabled附加属性设为True。

  6、使用字体缓存服务提高启动时间

  WPF应用程序之间可以共享字体数据,它是通过一个叫做PresentationFontCache Service的Windows服务实现的,它会随Windows自动启动。

  你可以在控制面板的“服务”中找到这个服务(或在“运行”框中输入Services.msc),确保这个服务已经启动。

  7、使用卸载事件卸载不必要的动画

  动画肯定会占用一定的资源,如果处置方式不当,将会消耗更多的资源,如果你认为它们无用时,你应该考虑如何处理他们,如果不这样做,就要等到可爱的垃圾回收器先生来回收资源。

  例如,假设要删除一个StoryBorad,在Unload事件中使用StoryBorad的Remove方法,下面的例子来自MSDN。

<EventTrigger RoutedEvent="Page.Unloaded" >
          
<EventTrigger.Actions>
            
<RemoveStoryboard BeginStoryboardName="myBeginStoryboard" />
          
</EventTrigger.Actions>
  
</EventTrigger>

 

  8、使用容器回收提高性能

  你可以通过回收执行虚拟化的容器来提高性能,下面的代码片段将ViruatlizationMode设为Recycling,它让你可以获得更好的性能。当用户滚动或抵达另一个项目时,它强制重复使用容器对象。

settingVirtualizingStackPanel.VirtualizationMode="Recycling"

 

  9、预测图像绘制能力

  使用RenderCapability.Tier属性确定机器是支持硬件加速,还是部分硬件加速,疑惑没有硬件加速,下面的代码显示了你要如何检查Tier。

int displayTier = (System.Windows.Media.RenderCapability.Tier > 16)
  
  
if (displayTier == 0)
  {
    
//no hardware acceleration
  }
  
else if (displayTier == 1)
  {
    
//partial hardware acceleration
  }
  
else
  {
    
//supports hardware acceleration
  }

 

  确定了之后,你就可以有选择性地选择那些在用户硬件上工作得很好的功能

  10、使用WPF分析工具分析WPF程序

  分析WPF程序是理解其行为很重要的一步,市场上有大量现成的WPF程序分析工具,如Snoop,WPFPerf,Perforator和Visual Profiler,其中Perforator和Visual Profiler是WPF Performance Suite的一部分,要了解这些工具的用法,请去它们的项目主页。

0
相关文章