我一直在研究几个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>
所以我的问题是:有不同的方法吗?你认为我的方法有一些消极方面吗?最重要的是:你知道更有效的方法来实现我的目标吗?
答案 0 :(得分:1)
由于每个新应用都是主题,我只需在Generic.xaml中定义一些画笔,并执行{DynamicResource HoverBrush}。
按钮样式的xaml可以保持不变,并且在每个新应用程序中,您只需要在Generic.xaml中定义具有相同名称的新画笔