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

自定义ToggleButton鼠标悬停出现蓝色矩形的原因及解决咨询

问题根源

你看到的蓝色矩形是内部嵌套的Button控件的默认悬停样式——你给ToggleButton自定义了样式,但里面的Button仍使用系统默认样式,鼠标悬停时就会触发系统自带的蓝色高亮效果。

解决方法

推荐两种处理思路,第一种更简洁合理:


方法一:移除内部嵌套Button,直接用ToggleButton自带的内容展示

ToggleButton本身具备显示内容的能力,没必要嵌套Button,既简化结构又避免样式/事件冲突:

修改后的完整样式代码:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style BasedOn="{StaticResource {x:Type ToggleButton}}"
           TargetType="{x:Type ToggleButton}"
           x:Key="ControlButtonToggle">
        <Style.Setters>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="2"/>
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                        <Border x:Name="RootBorder"
                                CornerRadius="10"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}">
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              Margin="5"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="RootBorder" Property="Opacity" Value="0.8"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter Property="Background" Value="LightGreen"/>
                                <Setter Property="BorderBrush" Value="Green"/>
                                <Setter Property="Content" Value="Enabled"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="False">
                                <Setter Property="Background" Value="#FFFF5454"/>
                                <Setter Property="BorderBrush" Value="Red"/>
                                <Setter Property="Content" Value="Disabled"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
</ResourceDictionary>

方法二:给内部Button自定义样式,禁用默认悬停效果

如果一定要保留内部Button,需要给它设置OverridesDefaultStyle="True",并定义无高亮的极简样式:

以IsChecked=True模板内的Button为例,修改如下:

<Button Margin="1"
        Content="Enabled"
        BorderThickness="0"
        Background="Transparent"
        VerticalContentAlignment="Center"
        Padding="5"
        Foreground="Black"
        BorderBrush="Green"
        OverridesDefaultStyle="True">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ContentPresenter HorizontalAlignment="Center"
                                          VerticalAlignment="Center"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

IsChecked=False模板内的Button需要做完全相同的修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:52:53