Повторное использование стилей и шаблонов

Я работал над несколькими проектами Wpf. В каждом проекте нам нужно было стилизовать стандартные элементы управления Wpf (например, Button). Каждый раз, когда мы начинали новый проект, мы создавали наши шаблоны и стили с нуля или просто копировали их из одной сборки в другую.

Поскольку я ненавижу копировать и воссоздавать один и тот же код снова и снова, я хочу собрать эти стили и переместить их в одно место, чтобы я мог использовать их в нескольких проектах с гораздо меньшими усилиями.

Пример модификации (снова с использованием элемента управления Button): нам нужно изменить кисти различных состояний кнопок, чтобы они соответствовали требованиям для приложения.

            | Hover-Brush | Click-Effect   | 
|-----------|-------------|----------------|
| Project A | Orange      | Light Orange   |
| Project B | Blue        | Light Blue     |
| ...       | ...         | ...            |

Для достижения моей цели мне нужно абстрагировать этот пример:

<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="Border" Background="Orange">
                    <!-- Further elements required to build our button -->
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="LightOrange" />
                    </Trigger>
                    <!-- Further triggers for other effects -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>

Как вы можете видеть, цвета жестко закодированы, поэтому стиль не может быть использован повторно. Моя идея состоит в том, чтобы использовать прикрепленные свойства, которые стиль может использовать для привязки. Если бы я определил прикрепленное свойство HoverBrush и использовать его для привязки новый стиль будет выглядеть так:

<Style TargetType="{x:Type Button}"
       x:Key="DefaultButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="Border" Background="{TemplateBinding Background}">
                    <!-- Further elements required to build our button -->
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Border" 
                                Property="Background" 
                                Value="{Binding Path=styles:Brushes.HoverBrush, 
                                                RelativeSource={RelativeSource TemplatedParent}, 
                                                FallbackValue={StaticResource SomeBrush}}" />
                    </Trigger>
                    <!-- Further triggers for other effects -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
</Style>

Этот стиль уменьшит разметку, необходимую для новой темы в другом приложении, до следующего:

<Style TargetType="{x:Type Button}"
       BasedOn="{StaticResource DefaultButton}">
    <Setter Property="styles:Brushes.HoverBrush"
            Value="LightOrange" />
</Style>

Так что мой вопрос (ы) будет: Есть ли разные подходы? Видите ли вы некоторые отрицательные стороны моего подхода? И самое главное: знаете ли вы более эффективные способы достижения моей цели?

1 ответ

Решение

Поскольку каждое новое приложение будет тематическим, я бы просто определил некоторые кисти в Generic.xaml и сделал {DynamicResource HoverBrush}.

Xaml для стиля кнопки может остаться прежним, и в каждом новом приложении вам просто нужно определить новые кисти с теми же именами в Generic.xaml

Другие вопросы по тегам