我对WPF性能有一般性质疑。我们有一个相对简单的表单应用程序一些团队成员认为,重新设计基本控件的模板将提高性能和可维护性。一种优选的技术是为控件创建多个控件模板,并将其与触发器交换出来。相信更小的视觉树将更具性能。
例如,复选框模板现在是两个模板,一个已选中,另一个未选中:
<ControlTemplate x:Key="CheckedCheckBoxCT" TargetType="{x:Type CheckBox}">
<Grid x:Name="gLayoutRoot" VerticalAlignment="Center" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="colCheck" />
<ColumnDefinition x:Name="colContentLabel" />
</Grid.ColumnDefinitions>
<Rectangle x:Name="rectOuter"
Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="0.5"
Fill="White"
Width="13" Height="13" />
<Rectangle x:Name="rectInner"
Stroke="{TemplateBinding OpacityMask}"
StrokeThickness="0.5"
Width="9" Height="9"
Fill="{TemplateBinding Background}"/>
<Path x:Name="CheckMark"
Data="{DynamicResource CheckSymbol}"
Fill="{TemplateBinding Foreground}"/>
<ContentPresenter x:Name="cpContent" />
</Grid>
</ControlTemplate>
然后取消选中(注意没有路径元素):
<ControlTemplate x:Key="CheckBoxCT" TargetType="{x:Type CheckBox}">
<Grid x:Name="gLayoutRoot"
VerticalAlignment="Center"
HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="colCheck" />
<ColumnDefinition x:Name="colContentLabel" />
</Grid.ColumnDefinitions>
<Rectangle x:Name="rectOuter"
Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="0.5"
Fill="White"
Width="13" Height="13" />
<Rectangle x:Name="rectInner"
Stroke="{TemplateBinding OpacityMask}"
StrokeThickness="0.5"
Fill="{TemplateBinding Background}"
Width="9" Height="9" />
<ContentPresenter x:Name="cpContent"
Margin="5,0,0,0"
VerticalAlignment="Center"
Grid.Column="1" />
</Grid>
</ControlTemplate>
关于制作一个带有可选文本的只读文本框的讨论类似,使用触发器将文本框换出一个文本块(不能从中选择文本)。
这是否真的可以将性能提升到任何可观的程度?使用复选框,显示/隐藏检查的触发器,而不是两个不同的控件模板,是否大致相同或更好?
我真的不在乎,但似乎增加了很多复杂性而没有多少收益。我很好奇其他人的意见,尤其是。如果基于客观经验。 (你可以看到我不在乎设置一些示例应用程序并测试它们的性能。:))
谢谢!
答案 0 :(得分:1)
这是一个讨论Visual Studio性能问题的blog post,他们提到简化可视化树并不是他们所看到的。在您的示例中,我认为为复选框设置两个模板会阻碍而不是提高可维护性,因为修改外观将需要对两者进行更改。单击时切换模板可能比调整元素的可见性要慢。
关于整体性能,我会更多地关注效果,VisualBrushes等,但是简化使用的模板(ItemTemplates)可能是值得的,如果只读文本框的情况是在具有大量元素的ItemControl中,大多数会被禁用我会倾向于这样做。有关WPF性能的资源很多,包括该帖子中提到的一些。