You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XAML及Material Design Xaml Toolkit中修改按钮悬停颜色?

解决Material Design XAML按钮悬停颜色不生效的问题

你的代码之所以没生效,核心原因有两个:

  1. 直接在<Button>标签上设置的Background="Transparent"是本地属性值,优先级高于Style中的Trigger设置,会覆盖悬停时的背景修改。
  2. MaterialDesignFlatButton的默认模板使用VisualStateManager管理状态(如鼠标悬停),自定义的Style Trigger会被模板内的状态逻辑覆盖。

下面提供两种可行的解决方案:


方案1:移除本地属性,重写模板状态

先移除Button标签上的Background="Transparent",转而在Style中设置初始背景,并通过重写ControlTemplate修改悬停状态:

<Button Width="45" Margin="0" Height="40" BorderThickness="0" Click="MinimizeButton_Click">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatButton}">
            <!-- 在Style中设置初始背景,替代本地属性 -->
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border x:Name="border" 
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                SnapsToDevicePixels="True">
                            <ContentPresenter x:Name="contentPresenter"
                                              Focusable="False"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              Margin="{TemplateBinding Padding}"
                                              RecognizesAccessKey="True"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <!-- 修改鼠标悬停时的背景 -->
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="border" Property="Background" Value="DarkRed"/>
                            </Trigger>
                            <!-- 保留其他必要状态逻辑 -->
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="border" Property="Background" Value="DarkRed"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter TargetName="border" Property="Opacity" Value="0.5"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
    <Image Source="Images/minimize.png" Height="15" Width="15" />
</Button>

方案2:使用Material Design附加属性(更简洁)

Material Design XAML库提供了专门的附加属性,无需重写模板即可修改悬停背景,前提是项目已引用MaterialDesignThemes库,并在XAML中声明命名空间:

<!-- 先在根元素声明命名空间:xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" -->
<Button Width="45" Margin="0" Height="40" BorderThickness="0" 
        Click="MinimizeButton_Click"
        Background="Transparent"
        <!-- 直接设置悬停背景 -->
        materialDesign:ButtonAssist.HoverBackground="DarkRed">
    <Button.Style>
        <Style TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatButton}"/>
    </Button.Style>
    <Image Source="Images/minimize.png" Height="15" Width="15" />
</Button>

内容的提问来源于stack exchange,提问作者jasonzs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:02:20