WPF(Windows Presentation Foundation)应用措施在没有图形加速设备的机器上运行速度很慢是个果然的奥秘,给用户的觉得是它太吃资源了,WPF措施的性能和硬件确实有很大的关系,越高等的机器性能越有优势。
措施性能改进不是一蹴而就的,好的设计可以消除影响性能的问题,例如,在运行时结构东西就会对措施的性能造成影响。虽然WPF通过增强的导航等成果供给了更丰富的用户界面,但你应该考虑你的用户是否简直需要富图形界面,尽管WPF有这样那样的问题,但在UI设计,出格是自界说气势派头和控件模板方面,简直给开发人员供给了不少灵活性。
衬着WPF措施的主要因素是它包罗的像素量,WPF使用微软的DirectX在措施运行的硬件长进行衬着,因此,如果你的机器有独立显卡,运行WPF措施会更流畅。除了提高硬件配置外,我们来看看10个提高WPF措施性能的软要领。
1、降低Bitmapscalingmode,加速图像衬着
当你的WPF措施中包罗有动画时,你可以使用RenderOptions东西的BitmapScalingMode属性降低资源消耗,需要将BitMapScalingMode属性的值设为LowQuality,这样就会使用加速算法措置惩罚惩罚图像,而不是默认的高质量图像重采样算法。下面的代码片段显示了最根基的实现要领:
RenderOptions.SetBitmapScalingMode(imageObject,BitmapScalingMode.LowQuality);
2、在正确的处所使用正确的元素
我们需要在正确的处所使用正确的元素,当你生成树时应制止使用UIElements作为子或嵌套控件,最好的例子是FlowDocument,,我们经常在FlowDocument中使用TextBlock元素。
<FlowDocument> <Paragraph> <TextBlock>some text</TextBlock> </Paragraph> </FlowDocument>
除了上面这样写外,我们还可以象下面这样重写XAML内容,Run元素不是UIElement,衬着时系统开销更小。
<FlowDocument><Paragraph><Run>some text</Run></Paragraph></FlowDocument>
类似的例子是使用Label控件的Content属性,如果在其生命周期内内容不止更新一次,并且是个字符串,这个数据绑定过程可能会阻碍措施的性能,由于内容是一个字符串,在数据绑按期间它会被抛弃,并从头创建。在这种情况下使用TextBlock将数据绑定到Text属性更有效。
在可视化树中呈现不须要的元素也会降低WPF措施的速度,你最好结合构造优化默认的控件模板。
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、使用延迟滚动增强用户体验