如何在WPF中更改按钮鼠标悬停时的背景?

19 浏览
0 Comments

如何在WPF中更改按钮鼠标悬停时的背景?

我的页面上有一个按钮,XAML代码如下:\n\n但是当我将鼠标悬停在按钮上时,按钮的背景会改变为默认的Windows灰色背景。
问题出在哪里?
\n这是鼠标悬停前和悬停后的按钮图片:
\n悬停前:
\"Before\"
\n悬停后:
\"After\"\n

0
0 Comments

问题出现的原因是想要在WPF中实现当鼠标悬停在按钮上时,按钮的背景色发生变化。文章给出了一个解决方法,即使用自定义的按钮样式,并在样式中设置触发器,当鼠标悬停在按钮上时,修改按钮的背景色。同时,还提到了如果不将按钮背景色设置为透明,那么只有当鼠标悬停在按钮的图标上时,按钮才会发生变化,这并不太实用。

解决方法如下:

首先,定义一个名为"TransparentStyle"的按钮样式,目标类型为Button。在样式的模板中,将按钮放置在一个边框中,并在边框的样式中设置触发器。当鼠标悬停在按钮上时,将边框的背景色设置为"DarkGoldenrod"。同时,在边框中放置一个背景为透明的网格,用于显示按钮的内容。

接下来,在使用按钮的地方,将按钮的样式设置为"TransparentStyle",并设置按钮的内容为一个包含蓝色十字图标的网格。

这样,当鼠标悬停在按钮上时,按钮的背景色就会变为"DarkGoldenrod",实现了按钮悬停时背景色的变化。

这个解决方法对我来说非常有用,还提到了使用x:Key="TransparentStyle"来定义按钮样式以及使用样式的方法,非常感谢!

0
0 Comments

问题原因:所有的答案都涉及完全替换默认的按钮行为,但是我认为了解只更改你关心的部分是有用和重要的,方法是通过编辑现有的默认模板来实现。

解决方法:在处理WPF按钮上的悬停效果的情况下,WPF按钮元素上的外观更改是由按钮的默认样式中的触发器引起的,该样式基于IsMouseOver属性,并设置了控件模板中顶级边框元素的Background和BorderBrush属性。按钮元素的背景位于边框元素的背景下面,因此更改Button.Background属性不会阻止悬停效果的显示。

尽管可以通过自己的setter覆盖此行为,但由于需要影响的元素位于模板中并且无法直接在自己的XAML中访问,所以这种方法会很困难且过于复杂。

另一种选择是将图形用作Button的Content而不是Background。如果需要在图形上方添加其他内容,可以使用Grid将它们组合为内容的顶级对象。

然而,如果你只是想完全禁用悬停效果(而不仅仅是隐藏它),你可以使用Visual Studio XAML Designer:

1. 在编辑XAML时,选择"设计"选项卡。

2. 在"设计"选项卡中,找到要禁用效果的按钮。

3. 右键单击该按钮,选择"编辑模板/编辑副本..."。在弹出的提示中选择新模板资源的位置。这样做似乎没有任何效果,但实际上,设计器将会在你指定的位置添加新的资源,并更改按钮元素以引用使用这些资源作为按钮模板的样式。

4. 现在,你可以编辑该样式。最简单的方法是删除或注释掉...元素。当然,你可以在此时对模板进行任何更改。

完成后,按钮样式将如下所示:

(注意:实际代码中可以省略XML命名空间的限定...我在这里提供它们只是因为Stack Overflow的XML代码格式化程序会对没有完全限定名称和XML命名空间的

在上述代码中,通过修改ControlTemplate中Button的样式,达到更改Button的MouseOver背景的目的。通过设置Style的Trigger属性,当IsMouseOver为True时,更改Button的Background为Red。

这样修改后,Button的MouseOver状态下的背景颜色将从默认的蓝色改为红色,并且去除了在rollover时出现的蓝色框。

如果将上述代码放置在App.xaml文件中,可能需要做其他一些操作才能生效,具体操作可根据实际情况进行。

0