wpf按钮背景悬停颜色

Posted

技术标签:

【中文标题】wpf按钮背景悬停颜色【英文标题】:wpf button background hover color 【发布时间】:2013-06-26 22:04:48 【问题描述】:

我正在尝试在悬停时更改 xaml 中按钮样式的背景颜色 这是我目前的方法,但它不起作用。正在使用默认的悬停颜色

<Style x:Key="AtStyle" TargetType="Button">
        <Setter Property="Background">
            <Setter.Value>
                <SolidColorBrush Color="StaticResource AtBlue" />
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Padding" Value="12,6" />
        <Setter Property="BorderThickness" Value="0" />
        <Setter Property="FontSize" Value="18.667" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background">
                    <Setter.Value>
                        <SolidColorBrush Color="Red" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

我看到其他解决方案说您需要覆盖 Control 模板来实现这一点,但这些解决方案还需要您定义边框和内容,这似乎没有必要。在 Xaml 中定义悬停状态的最小方法是什么?

【问题讨论】:

【参考方案1】:

我根据您的要求创建了基于简单样式的按钮,

XAML

<Style  TargetType="Button">
  <Setter Property="Background"
          Value="Blue" />
  <Setter Property="HorizontalAlignment"
          Value="Center" />
  <Setter Property="VerticalAlignment"
          Value="Center" />
  <Setter Property="Foreground"
          Value="White" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="x:Type Button">
        <Border x:Name="bg"
                Background="TemplateBinding Background"
                BorderThickness="2"
                BorderBrush="White">
          <ContentPresenter HorizontalAlignment="TemplateBinding HorizontalAlignment"
                            VerticalAlignment="TemplateBinding VerticalAlignment" />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver"
                   Value="True">
            <Setter Property="Background"
                    Value="Red"
                    TargetName="bg" />
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

【讨论】:

这种风格太简单了。它破坏了访问密钥,甚至不支持禁用状态。这也是错误的,因为ContentPresenter 上的对齐属性应该使用内容对齐属性。 @Athari:感谢您的建议,是的,这很简单。他们需要包括禁用和键盘焦点状态的触发器。【参考方案2】:

我们来看一下 Aero 主题默认按钮样式的模板:

<ControlTemplate TargetType="x:Type ButtonBase">
    <theme:ButtonChrome Name="Chrome"
            Background="TemplateBinding Background"
            BorderBrush="TemplateBinding BorderBrush"
            RenderDefaulted="TemplateBinding Button.IsDefaulted"
            RenderMouseOver="TemplateBinding IsMouseOver"
            RenderPressed="TemplateBinding IsPressed"
            SnapsToDevicePixels="True">
        <ContentPresenter
                Margin="TemplateBinding Padding"
                SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"
                VerticalAlignment="TemplateBinding VerticalContentAlignment"
                HorizontalAlignment="TemplateBinding HorizontalContentAlignment"
                RecognizesAccessKey="True"/>
    </theme:ButtonChrome>
    <ControlTemplate.Triggers>
        <Trigger Property="IsKeyboardFocused" Value="True">
            <Setter TargetName="Chrome" Property="RenderDefaulted" Value="True"/>
        </Trigger>
        <Trigger Property="ToggleButton.IsChecked" Value="True">
            <Setter TargetName="Chrome" Property="RenderPressed" Value="True"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="#ADADAD"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

如您所见,鼠标悬停和按下的颜色被定义为ButtonChrome 的属性RenderMouseOverRenderPressed 上的绑定。 ButtonChrome 的设计方式,它们优先于 Background 属性中的任何值。因此,不幸的是,覆盖单击或突出显示按钮的背景颜色的唯一方法是覆盖其模板。

【讨论】:

这个例子不起作用......为什么你认为这是一个比另一个更好的答案?那个正在工作...... @Bondye 这个答案不应该“起作用”,它应该回答“为什么”这个问题并给出如何完全解决问题的指导。接受的答案“有效”,但在数量非常有限的情况下,如果需要更复杂的东西,则无济于事。更详细的分析在我对另一个问题的评论中。 TL;DR:不要只是复制粘贴;试着去理解并自己去做。

以上是关于wpf按钮背景悬停颜色的主要内容,如果未能解决你的问题,请参考以下文章

悬停UWP时更改按钮颜色[重复]

如何使用 onclick 按钮更改悬停颜色

如何更改单选按钮悬停颜色

C# - 悬停按钮删除透明背景

CSS 更改按钮悬停颜色

C# 按钮背景颜色