WPF: замена шаблонов управления повышает производительность, эффективность? - PullRequest
0 голосов
/ 20 августа 2010

У меня общий вопрос о производительности 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 Ответ

1 голос
/ 20 августа 2010

Вот пост в блоге , в котором обсуждаются проблемы производительности в отношении Visual Studio, они упоминают, что упрощение визуального дерева не было чем-то, на что они смотрели много.В вашем примере я думаю, что наличие двух шаблонов для флажка скорее помешает, чем улучшит удобство обслуживания, так как изменение внешнего вида потребует изменения обоих.Кроме того, переключение шаблона при нажатии, скорее всего, будет медленнее, чем настройка видимости элемента.

Что касается общей производительности, я бы уделил больше внимания эффектам, VisualBrushes и т. Д., Но упрощение используемых шаблонов (ItemTemplates)стоило бы, если бы ситуация с текстовым полем только для чтения находилась в ItemControl с большим количеством элементов, и большинство из них было бы отключено, я был бы склонен сделать это.Существует довольно много ресурсов, посвященных производительности WPF, включая некоторые, упомянутые в этом посте.

...