我一直在从事几个 Wpf 项目。在每个项目中,我们都需要设置默认 Wpf 控件(例如 Button)的样式。每次我们开始一个新项目时,我们都会从头开始构建我们的模板和样式 - 或者只是将它们从一个程序集复制到另一个程序集。
因为我讨厌一遍又一遍地复制和重新创建相同的代码,所以我想收集这些样式并将它们移动到一个地方,这样我就可以更轻松地在多个项目中使用它们。
修改示例(再次使用 Button 控件):我们需要更改不同按钮状态的画笔以适应应用程序的要求。
| Hover-Brush | Click-Effect |
|-----------|-------------|----------------|
| Project A | Orange | Light Orange |
| Project B | Blue | Light Blue |
| ... | ... | ... |
为了实现我的目标,我需要抽象这个 samplestyle:
<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>
所以我的问题是:有不同的方法吗?你看到我的方法有一些负面的方面吗?最重要的是:你知道更有效的方法来实现我的目标吗?