【问题标题】:Stop button color change on Mouseover鼠标悬停时停止按钮颜色更改
【发布时间】:2012-08-16 03:06:15
【问题描述】:

好的..这很奇怪....我定义了一个按钮,实际上是 5 个按钮,每个按钮都有不同的颜色,但是在鼠标悬停时,它们只是将颜色更改为冰蓝色....我试过了使用以下代码覆盖它:

        <Button Name="btn1" Content="Button" Width="65" Height="45" Background="Green" Margin="1,1,0,1" FontWeight="Bold">
            <Button.Style>
                <Style>
                    <Style.Triggers>
                        <Trigger Property="Button.IsMouseOver" Value="True">
                            <Setter Property="Button.Background" Value="Yellow" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
            <Button.LayoutTransform>
                <RotateTransform Angle="270"/>
            </Button.LayoutTransform>
        </Button>

但它仍然不起作用......我想要的是它应该保持它已经被赋予的背景颜色(每个按钮不同),所以问题是:我是否必须为每个按钮一次又一次地定义它按钮(触发器不起作用,颜色变为冰蓝色)或者我可以在资源文件中使用通用值定义它,它要么停止颜色更改,要么只是将背景设置为现有属性 编辑:为了清楚起见,我希望按钮在鼠标悬停时停止更改其颜色,并保留我分配给它的任何颜色.....

【问题讨论】:

  • 你能阻止它变成“冰蓝色”,还是你的问题?
  • 不......我无法阻止它......是的,这是我的问题,我不希望它变成冰蓝色,但保留我分配给它的任何颜色
  • 那么我认为您的问题与以下内容重复:stackoverflow.com/questions/1224439/…
  • 我已经解决了这个问题,但它对我不起作用......它在设置器中设置了一种颜色,该颜色将应用于所有按钮,而不管它们的背景颜色如何......我只是不希望颜色改变....这就是区别
  • 我不确定你是从哪里得到“冰蓝色”的,但是当它改变颜色时按钮是聚焦的吗?它有可能从SystemColors 中提取颜色,在这种情况下,您可以尝试为您的按钮覆盖SystemColor(可能是透明的?)

标签: wpf button user-interface


【解决方案1】:

根据我链接的 cmets 和 SO 帖子:那篇文章将该样式应用于 Button 类型的任何东西,这就是它适用于所有按钮的原因(这不一定是坏事)。但要从那篇文章中得出的重点是,您需要修改的是ControlTemplate

所以你会想做这样的事情:

    <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border x:Name="Chrome" BorderBrush="Black" BorderThickness="2" CornerRadius="2" Background="{TemplateBinding Property=Background}">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

这并不完美,因为它失去了所有的交互性(即你不能告诉你已经推动它,悬停在它上面或任何东西)。但它为您提供了一个很好的起点。

这里的一个关键点是BorderBackground 属性绑定到TemplateParent Property=Background,这意味着它将读取正在模板化的按钮的背景属性并使用它的背景颜色。这使您可以更轻松地使用单一样式来覆盖所有 5 个按钮。您可以(并且可能想要)使用 BorderBrush 属性做类似的事情。

还要注意我的样式有一个x:Key 值,所以为了使用它,你可以这样做:

    <Button x:Name="btn1" Content="Button" Width="65" Height="45" Background="Green" Margin="1,1,0,1" FontWeight="Bold" Style="{DynamicResource ButtonStyle1}">
        <Button.LayoutTransform>
            <RotateTransform Angle="270"/>
        </Button.LayoutTransform>
    </Button>

您可以删除x:Key 属性,该样式确实将应用于您声明资源的任何容器内的所有按钮。

【讨论】:

  • 真的很好......这确实如我所愿,只是在我将其标记为答案之前进行了一些澄清......为什么我必须使用边框作为背景(contentpresenter 没有该属性。 ...我检查过) ??....您也说过,它失去了所有的交互性,但我通过单击按钮进行检查,并触发了它的单击事件....那么我们到底在说什么??
  • ContentPresenter 基本上是一个占位符控件,所以它没有很多属性。您不必必须使用边框,您可以使用其他容器来指定背景颜色,这只是Border 通常是可取的,因为它为您提供了边框以及您通常想要的边框角。就“交互性”而言,通常一个按钮会有某种鼠标悬停行为,比如稍微不同的颜色,或者边框突出显示,或者只是让你有一些视觉提示按钮处于活动状态。这有帮助吗?
猜你喜欢
  • 2016-12-11
  • 2017-11-29
  • 1970-01-01
  • 2018-07-20
  • 2016-02-01
  • 1970-01-01
  • 2018-05-25
  • 2012-08-21
相关资源
最近更新 更多