重用样式和模板
Reuse of styles and templates
我一直在从事几个 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>
所以我的问题是:是否有不同的方法?您是否看到我的方法有负面影响?最重要的是:你知道更有效的方法来实现我的目标吗?
由于每个新应用都会有主题,所以我会在 Generic.xaml 中定义一些画笔并执行 {DynamicResource HoverBrush}。
按钮样式的 xaml 可以保持不变,在每个新应用中,您只需要在 Generic.xaml
中定义具有相同名称的新画笔
我一直在从事几个 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>
所以我的问题是:是否有不同的方法?您是否看到我的方法有负面影响?最重要的是:你知道更有效的方法来实现我的目标吗?
由于每个新应用都会有主题,所以我会在 Generic.xaml 中定义一些画笔并执行 {DynamicResource HoverBrush}。
按钮样式的 xaml 可以保持不变,在每个新应用中,您只需要在 Generic.xaml
中定义具有相同名称的新画笔