WPF:交换控制模板可以提高性能和效率吗?

时间:2010-08-20 15:43:41

标签: wpf performance templates controls styles

我对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 个答案:

答案 0 :(得分:1)

这是一个讨论Visual Studio性能问题的blog post,他们提到简化可视化树并不是他们所看到的。在您的示例中,我认为为复选框设置两个模板会阻碍而不是提高可维护性,因为修改外观将需要对两者进行更改。单击时切换模板可能比调整元素的可见性要慢。

关于整体性能,我会更多地关注效果,VisualBrushes等,但是简化使用的模板(ItemTemplates)可能是值得的,如果只读文本框的情况是在具有大量元素的ItemControl中,大多数会被禁用我会倾向于这样做。有关WPF性能的资源很多,包括该帖子中提到的一些。