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:换出控制模板可以提高性能和效率?的主要内容,如果未能解决你的问题,请参考以下文章

怎么提高电脑内存的性能及使用效率都有哪些方法

在WPF中 使用StreamGeometry提高性能。

WPF应用程序的性能提升

提高 WPF 应用程序性能的最佳方法

提高性能及操作硬件的能力

提高 jQuery 模板性能