WPF:换出控制模板可以提高性能和效率?
Posted
技术标签:
【中文标题】WPF:换出控制模板可以提高性能和效率?【英文标题】:WPF: swapping out control templates increases performance, efficiency? 【发布时间】:2011-04-01 17:48:06 【问题描述】:我有一个关于 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>
关于制作带有可选文本的只读文本框有类似的讨论,使用触发器将文本块(您无法从中选择文本)换成文本框。
这真的会在任何明显程度上提高性能吗?使用复选框,显示/隐藏检查的触发器,而不是两个不同的控件模板,会大致相同还是更好?
我真的不在乎,但似乎增加了很多复杂性却没有多少收获。我很好奇其他人的意见是什么,尤其是。如果根据客观经验。 (你可以看到我不太关心设置一些示例应用程序并测试它们的性能。:))
谢谢!
【问题讨论】:
【参考方案1】:这是一个blog post 讨论与 Visual Studio 相关的性能问题,他们提到简化可视化树并不是他们考虑太多的事情。在您的示例中,我认为为复选框设置两个模板会阻碍而不是提高可维护性,因为修改外观需要同时更改两者。单击时切换模板也可能比调整元素的可见性要慢。
关于整体性能,我会更加关注效果、VisualBrushes 等,但如果使用只读文本框的情况是在具有大量元素的 ItemControl 中并且大多数会被禁用我会倾向于这样做。有很多关于 WPF 性能的资源,包括那篇文章中提到的一些资源。
【讨论】:
我同意。切换模板所需的代码可能比让 WPF 自己做脏活要花费更多的时间。另外,我真的不知道基准测试是否容易。以上是关于WPF:换出控制模板可以提高性能和效率?的主要内容,如果未能解决你的问题,请参考以下文章