WPF触发器无法按预期工作

7

我希望有一个红色的按钮,当鼠标悬停在上面时变成黑色。

    <Button Content="Hover me" Grid.Column="3" Grid.Row="3">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Red"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Black"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

然而,我的问题是当我将鼠标悬停在按钮上时,它会变成默认的Windows样式,呈现出渐变灰色外观。

1个回答

20

试一试

<Window.Resources>
    <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Red"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <ContentPresenter x:Name="PART_Content"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          TextElement.Foreground="{TemplateBinding Foreground}"></ContentPresenter>                        </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Black"/>
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

然后按照以下方式应用自定义样式

<Button Content="Hover me" Style="{StaticResource MyButtonStyle}" Height="30" Width="100"/>

原因是Button类型控件默认采用了Aero样式。该样式在ControlTemplate中定义了chrome,并且它自身对鼠标事件有特定的行为,这会覆盖你的触发器调用。

因此,你必须重写Button的默认ControlTemplate才能实现你想要的结果。


5
我已经搜寻了几个小时,这个有效,谢谢!不过应该有更好的方法——使用多行代码而不是一个简单的鼠标悬停触发背景颜色会更好。那个可怕的控制模板太冗长了,对于这样一个小事件来说,代码量太大了。;( - Terning

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