2

我一直在从事几个 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>

所以我的问题是:有不同的方法吗?你看到我的方法有一些负面的方面吗?最重要的是:你知道更有效的方法来实现我的目标吗?

4

1 回答 1

1

由于每个新应用程序都会有主题,我只需在 Generic.xaml 中定义一些画笔并执行 {DynamicResource HoverBrush}。

按钮样式的 xaml 可以保持不变,并且在每个新应用程序中,您只需要在 Generic.xaml 中定义具有相同名称的新画笔

于 2015-02-20T21:25:54.213 回答