Повторное использование стилей и шаблонов
Я работал над несколькими проектами 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