当鼠标悬停在按钮上时无法更改边框颜色

4

我试图在鼠标悬浮在按钮上时更改默认边框颜色,但无法使其起作用。我认为以下代码可以正常工作,但显然不行:

<Button>
    <Button.Resources>
        <Color x:Key="ControlMouseOverColor">somecolor</Color>
     </Button.Resources>
</Button>

有没有什么方法可以做到这一点?
2个回答

10

这是WPF中需要完成简单事情时需要进行稍微复杂的操作之一 :)。实际上,您需要覆盖Button控件的ControlTemplate,因为当鼠标悬停在按钮上时,边框颜色是由默认ControlTemplate确定的。下面是具有默认ControlTemplate的按钮,减去了设置IsMouseOver为红色的setter:

    <Button>
        <Button.Template>
            <ControlTemplate TargetType="{x:Type ButtonBase}">
                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="Button.IsDefaulted" Value="True">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" TargetName="border" Value="#FFC4E5F6"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF2C628B"/>
                    </Trigger>
                    <Trigger Property="ToggleButton.IsChecked" Value="True">
                        <Setter Property="Background" TargetName="border" Value="#FFBCDDEE"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF245A83"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Background" TargetName="border" Value="#FFF4F4F4"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="#FFADB2B5"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="#FF838383"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Button.Template>
        Click
    </Button>

2
在WPF中,常规的解决方案是属性触发器:
<Button>
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="BorderBrush" Value="Black"></Setter>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Red"></Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

属性触发器旨在在条件变为真时做出反应,但当该条件变为假时恢复其先前状态。因此,我们在这里说:当IsMouseOver属性变为true时,将定义的按钮的边框刷成红色。当条件变为false时,它将恢复为黑色(我不确定边框刷的默认颜色是什么,所以您可以删除第4行)。


我不相信这会起作用,因为ControlTemplate的触发器优先级更高。 - Rowbear
尽管我的问题是关于用户控件内的堆栈面板而不是按钮,但这个答案帮助我轻松地在悬停时更改用户控件的边框。这就是为什么我给它点了赞。谢谢。 - Noah Bridge

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