覆盖样式

时间:2016-02-01 14:25:05

标签: wpf wpf-style

我有一个带切换按钮的应用程序,需要根据检查状态更改背景。此应用程序还有一些常规按钮,与切换按钮共享相同的背景。此外,它们都有圆角。

所以我提出了这些风格:

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Control}}" x:Key="OnButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border CornerRadius="15" Background="{StaticResource GradientBrushOn}" BorderThickness="1" Padding="2">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="Button" BasedOn="{StaticResource OnButton}" x:Key="OffButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border CornerRadius="15" Background="{StaticResource GradientBrushOff}" BorderThickness="1" Padding="2" x:Name="TheBorder">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

长话短说,我正在寻找缩短OffButton样式的方法,以便它只将OnButton样式的背景属性从GradientBrushOn更改为GradientBruthOff }。

这是我第一次使用WPF,所以我认为这应该是一个相当基本的东西,但我找不到任何方法去做,即使在谷歌上花了2个小时也没有。

1 个答案:

答案 0 :(得分:5)

使用Button.Background属性,并ControlTemplate使用TemplateBinding

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Control}}" x:Key="OnButton">
    <Setter Property="Background" Value="{StaticResource GradientBrushOn}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border CornerRadius="15" Background="{TemplateBinding Background}" BorderThickness="1" Padding="2">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="Button" BasedOn="{StaticResource OnButton}" x:Key="OffButton">
    <Setter Property="Background" Value="{StaticResource GradientBrushOff}"/>
</Style>

如果你这样做也会有效

<Button Style="..." Background="Green"/>

修改

由于您必须在ControlTemplate中正常更改整个模板,因此您可以使用控件的内置属性,例如BackgroundBorderBrushBorderThickness,{{ 1}},PaddingHorizontalContentAlignment等等,这样您就可以共享模板,只调整Style中的内容,例如

VerticalContentAlignment