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

XAML中鼠标悬停时将Button的Background设为BorderBrush值的问题

解决Button鼠标悬停时Background同步BorderBrush颜色的问题

你的问题出在Style Trigger里的绑定方式不对,另外也可以换一种更直接的实现方式,下面给你两种可行的方案:

方案一:修正Style Trigger的绑定

你原来用AncestorType来绑定Button的BorderBrush,其实完全没必要,直接绑定当前Button自身的属性就行,把Trigger里的Background Setter改成下面这样:

<Style TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="15">
                    <ContentPresenter HorizontalAlignment="Center"
                                      VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <!-- 用RelativeSource Self绑定当前Button的BorderBrush -->
            <Setter Property="Background" 
                    Value="{Binding BorderBrush, RelativeSource={RelativeSource Self}}"/>
            <Setter Property="Cursor" Value="Hand"/>
        </Trigger>
    </Style.Triggers>
</Style>

方案二:在ControlTemplate内部添加Trigger(更推荐)

既然你已经重写了Button的ControlTemplate,直接在模板里的Border上添加Trigger,直接修改它的Background,这样逻辑更内聚,也避免Style和Template之间的绑定冲突:

<Style TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name="ButtonBorder"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="15">
                    <ContentPresenter HorizontalAlignment="Center"
                                      VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <!-- 直接修改模板内Border的Background为自身的BorderBrush -->
                        <Setter TargetName="ButtonBorder" Property="Background" 
                                Value="{Binding BorderBrush, ElementName=ButtonBorder}"/>
                        <Setter Property="Cursor" Value="Hand"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

两种方案都能解决你的问题,方案二更推荐,因为控件的视觉状态逻辑放在ControlTemplate里更符合WPF的设计思路,也更容易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:27