重用样式和模板

时间:2015-02-20 19:35:35

标签: c# .net wpf wpf-style

我一直在研究几个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 个答案:

答案 0 :(得分:1)

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

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

相关问题