鼠标悬停时更改背景颜色

3
我已经成功地制作了一个有圆角的按钮,但当鼠标悬停时似乎不能更改其背景颜色。透明度会发生变化,但背景颜色不会变。
<Style TargetType="Button" x:Key="FlatButtonStyle">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}" CornerRadius="4">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Orange"/>
            <Setter Property="Opacity" Value="0.91" />

        </Trigger>
    </Style.Triggers>
</Style>

正如您所看到的,我不确定为什么透明度可行而其他方法不行。但是,我认为这可能与实际按钮本身存在冲突:

<Button Style="{StaticResource FlatButtonStyle}" Content="Sign In" VerticalAlignment="Top" Margin="10,267,10,0" Background="#FF3650F3" Foreground="White" Height="29" Command="{Binding SignIn}">

有办法覆盖这个吗?我的目的是创建一个通用的,圆角按钮模板,并将背景色更改为橙色。但是我希望能够设置默认背景色,就像我在我的按钮中展示的那样。


你有没有尝试使用十六进制值,比如#FFFFA500,而不是使用Orange颜色名称? - Geoff James
@GeoffJames 是的,我有,但是没有任何结果。 - Dimitri
你看过这个答案了吗?:https://dev59.com/NWQm5IYBdhLWcg3w4CTA#17259993 - 我认为关键部分可能是<Setter Property="OverridesDefaultStyle" Value="True" />,需要放在你的Style声明中。 - Geoff James
1个回答

5

试试这个

<Style TargetType="Button" x:Key="FlatButtonStyle">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}" CornerRadius="4">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Border>
<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Setter TargetName="border" Property="Background" Value="Orange"/>
        <Setter Property="Opacity" Value="0.91" />
    </Trigger>
</ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

为了直接通过名称定位边框,但由于它在ControlTemplate内部,最好将触发器移动到那里。如果您像不透明度设置器那样省略名称,它足够聪明以知道您正在针对该按钮本身进行目标设置,因为它是该按钮的控件模板。因此,您可以针对单个组件以及按钮进行目标设置。


我刚刚评论了几乎相同的东西 - 我认为关键部分是 <Setter Property="OverridesDefaultStyle" Value="True" /> - Geoff James
@Dimitri,我添加了一些解释,我们总是使用控件模板触发器,因为这是最简单的方法,而且始终有效。 - adminSoftDK
@Dimitri - 所有的ControlTemplates都有一个触发器集合,就像Styles一样,如果你想为某个东西制作一个自定义模板,通常最好将基本功能触发器(如MouseOver/IsPressed等)放在模板本身中。这在样式之上,因为它是原始控件模板决定什么是什么,并且不能被样式所干扰(比如将OverridesDefaultStyle设置为true),除非你告诉样式使用不同的(或没有)模板。 - Logan
@Logan 收到了,谢谢大家的建议! - Dimitri

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