WPF如何从按钮样式中覆盖触发器

6

我在Windows资源中有以下按钮样式:

<Style x:Key="MyStyle" TargetType="{x:Type Button}">

    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0 0 0 3"/>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="Orange" />
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BorderBrush" Value="Red" />
        </Trigger>         
    </Style.Triggers>

</Style>

这个样式被两个wpf按钮共享。但是我想在一个按钮被按下时显示自定义颜色,颜色将会是绿色。

所以在这个特殊的按钮中,我想重写触发器中指定的边框笔刷属性的值,而不是红色,我想用绿色。

怎么做呢?

1个回答

13
你可以使用可以覆盖的{DynamicResource}设置BorderBrush属性:
<SolidColorBrush x:Key="pressed" Color="Red" />
<Style x:Key="MyStyle" TargetType="{x:Type Button}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0 0 0 3"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="Orange" />
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BorderBrush" Value="{DynamicResource pressed}" />
        </Trigger>
    </Style.Triggers>
</Style>
...
<Button Content="Red" Style="{StaticResource MyStyle}" />

<Button Content="Green" Style="{StaticResource MyStyle}">
    <Button.Resources>
        <SolidColorBrush x:Key="pressed" Color="Green" />
    </Button.Resources>
</Button>

或者你可以创建另一个 Style,它可以覆盖整个触发器:

<Button Content="Green">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource MyStyle}">
            <Style.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Foreground" Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

我喜欢你的第二个解决方案。我的按钮有一个控件模板,所以我应该在控件模板的哪个位置放置样式?抱歉,我在WPF方面非常新手... - Willy
我不认为我理解你的问题。我给了你一个如何覆盖自定义按钮触发器的示例,即你可以像我展示的那样为其定义一个特定的样式。 - mm8
你的答案是正确的。我来解释一下:我的按钮有一个像这样定义的模板:<Button> <Button.Template><ControlTemplate>....</ControlTemplate></Button.Template></Button> 现在我不知道如何将你的代码片段放在按钮内部。 - Willy
如果您有其他问题,请提出新的问题。请勿在评论栏中提出额外的问题。 - mm8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接