如何删除 WPF 按钮上的默认鼠标悬停效果?

     2023-02-22     190

关键词:

【中文标题】如何删除 WPF 按钮上的默认鼠标悬停效果?【英文标题】:How to remove default mouse-over effect on WPF buttons? 【发布时间】:2011-04-20 17:43:45 【问题描述】:

我的问题是,在 WPF 中,每当我尝试使用触发器或动画更改按钮背景的颜色时,默认的鼠标悬停效果(带有橙色光晕的灰色)似乎具有优先权。

经过大量搜索后,我对如何消除这种影响一无所知。

【问题讨论】:

【参考方案1】:

您需要创建自己的自定义按钮模板才能完全控制所有状态的外观。这是tutorial。

【讨论】:

谢谢,太完美了。做起来比我想象的要复杂,但现在一切正常。 出于某种原因,有 100 个关于为 WPF 控件创建自定义模板的答案,它们都是不必要的错误。没有理由为一个按钮编写 50 行模板代码来改变一件事情。您所要做的就是在 xaml 设计器中右键单击控件并创建模板代码的副本。 VS 将从那个确切的按钮创建一个样式,你可以从那里调整它。实际上需要 2 秒。 @TheMuffinMan 太棒了,但您是否觉得有点奇怪,需要 50 行模板代码才能阻止按钮在鼠标悬停时更改背景颜色? WPF 是多么愚蠢的复杂框架。 @Ash 或者有人会争辩说它正在引导用户朝着他们应该前进的方向前进。如果你有一个按钮需要一个新的悬停状态,那很可能是一个新的按钮类型;也许是导航按钮、托盘按钮等。如果是这样,您不应该为它修改一次性属性,它应该有自己的控件或样式组。这就是让你这样做的原因。 @TheMuffinMan:你真的是那个男人!使用 WPF 10 年,刚刚发现“编辑模板”选项!【参考方案2】:

这类似于 Mark Heath 提到的解决方案,但没有那么多代码来创建一个非常基本的按钮,没有内置的鼠标悬停动画效果。它保留了以黑色显示按钮边框的简单鼠标悬停效果。

例如,样式可以插入到 Window.Resources 或 UserControl.Resources 部分(如图所示)。

<UserControl.Resources>
    <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect -->
    <Style x:Key="MyButtonStyle" TargetType="Button">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border" 
                        BorderThickness="1"
                        Padding="4,2" 
                        BorderBrush="DarkGray" 
                        CornerRadius="3" 
                        Background="TemplateBinding Background">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="Black" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<!-- usage in xaml -->
<Button Style="StaticResource MyButtonStyle">Hello!</Button>

【讨论】:

我非常喜欢这个解决方案。但是,鼠标悬停触发器仅在鼠标悬停在按钮上的文本上时才会激活。我在按钮内添加了一个指定宽度的文本块来解决这个问题。 你先生是个圣人。【参考方案3】:

如果有人不想覆盖默认控制模板,那么这里就是解决方案。

您可以为可以具有 TextBlock 的按钮创建 DataTemplate,然后您可以在 IsMouseOver 属性上编写属性触发器以禁用鼠标悬停效果。 TextBlock 和 Button 的高度应该相同。

<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20">
    <Button.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <Trigger Property ="IsMouseOver" Value="True">
                                <Setter Property= "Background" Value="Black"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </Button.ContentTemplate>
</Button>

【讨论】:

【参考方案4】:

dodgy_coder 答案的扩展,增加了对..的支持。

维护 WPF 按钮样式

添加对 IsSelected 和悬停的支持,即切换按钮

    <Style x:Key="Button.Hoverless" TargetType="x:Type ButtonBase">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ButtonBase">
                    <Border Name="border"
                            BorderThickness="TemplateBinding BorderThickness"
                            Padding="TemplateBinding Padding"
                            BorderBrush="TemplateBinding BorderBrush"
                            Background="TemplateBinding Background">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True" />
                                <Condition Property="Selector.IsSelected" Value="False" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#FFBEE6FD" />
                        </MultiTrigger>

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="True" />
                                <Condition Property="Selector.IsSelected" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="#BB90EE90" />
                        </MultiTrigger>

                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsMouseOver" Value="False" />
                                <Condition Property="Selector.IsSelected" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="LightGreen" />
                        </MultiTrigger>

                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="border" Property="Opacity" Value="0.95" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

例子..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />

【讨论】:

【参考方案5】:

使用模板触发器:

<Style x:Key="ButtonStyle" TargetType="x:Type Button">
    <Setter Property="Background" Value="White"></Setter>
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type Button">
                <Border Background="TemplateBinding Background">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="White"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

【参考方案6】:

只是添加一个非常简单的解决方案,这对我来说已经足够了,我认为解决了 OP 的问题。我使用了解决方案in this answer,除了使用常规的Background 值而不是图像。

<Style x:Key="SomeButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Background="TemplateBinding Background">
                    <ContentPresenter />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

除了强制Background 始终是模板按钮的Transparent 背景之外,无需重新模板 - 完成此操作后,鼠标悬停不再影响背景。显然用任何首选值替换Transparent

【讨论】:

【参考方案7】:

松饼人有一个非常简单的答案,对我有用。

添加一些更具体的方向,至少对于 VS 2013:

右键单击控件 选择编辑模板 => 编辑副本... 我选择了“应用程序”来保存样式 您可以从这里直接编辑 App.xaml 并查看直观命名的属性。出于我的目的,我只是设置了 RenderMouseOver="False" 然后,在 MainWindow.xaml 或 GUI 所在的任何位置,您可以将新样式粘贴到 Button 标记的末尾,例如... Style="DynamicResource MouseOverNonDefault"/&gt;

【讨论】:

谁是松饼人? 哈哈。他对问题所有者接受的答案进行了第二次回复。不知道你问的是认真的还是开玩笑的。很难用像松饼人这样的名字来分辨。【参考方案8】:

这个链接对我帮助很大 http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/

UserControl.ResourcesWindow.Resources

中定义样式
 <Window.Resources>
        <Style x:Key="MyButton" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="TemplateBinding Background">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Opacity" Value="0.8" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

然后以这种方式将样式添加到您的按钮 Style="StaticResource MyButton"

<Button Name="btnSecond" Width="350" Height="120" Margin="15" Style="StaticResource MyButton">
    <Button.Background>
        <ImageBrush ImageSource="/Remove_Default_Button_Effect;component/Images/WithStyle.jpg"></ImageBrush>
    </Button.Background>
</Button>

【讨论】:

如何在 WPF 中删除鼠标悬停时的按钮发光

】如何在WPF中删除鼠标悬停时的按钮发光【英文标题】:HowtoremoveGlowofButtononMousehoverinWPF【发布时间】:2013-08-0922:33:53【问题描述】:我在WPF中使用了一个简单的按钮。我已经在背景上放置了按钮的图像。我的问题是,当我将鼠... 查看详情

按钮悬停效果和触摸 (WPF)

】按钮悬停效果和触摸(WPF)【英文标题】:Buttonhovereffectandtouch(WPF)【发布时间】:2013-07-1105:10:26【问题描述】:我有一个带有Button的WPF桌面应用程序。当我在普通PC上运行它并将鼠标光标移到按钮上时,它变成蓝色(默认Windows主... 查看详情

删除按钮上的引导导航栏悬停效果

】删除按钮上的引导导航栏悬停效果【英文标题】:removebootstrapnavbarhovereffectonbutton【发布时间】:2016-10-2500:11:08【问题描述】:我想从导航栏中的按钮中删除悬停效果,我该怎么做?[在此处输入图像描述][1]<navclass="navbarnavbart... 查看详情

如何通过将鼠标悬停在同一页面上的图像上来触发 CSS 动画按钮

】如何通过将鼠标悬停在同一页面上的图像上来触发CSS动画按钮【英文标题】:Howtotriggeracssanimatedbuttonbyhoveringoveranimageonthesamepage【发布时间】:2013-08-2501:17:58【问题描述】:我的网站出现问题。在主页上,我有一张图片。图片... 查看详情

如何删除/切换元素上的悬停类(单击时翻译)而无需再次移动鼠标?

】如何删除/切换元素上的悬停类(单击时翻译)而无需再次移动鼠标?【英文标题】:Howtoremove/togglehoverclassonanelement(thatistranslateduponclick)withouthavingtomovethemouseagain?【发布时间】:2016-01-0823:52:22【问题描述】:如果您单击并且不... 查看详情

如何恢复 Bootstrap 3 按钮的悬停效果?

】如何恢复Bootstrap3按钮的悬停效果?【英文标题】:HowtoputbackthehovereffectonBootstrap3\'sbuttons?【发布时间】:2013-09-0107:45:33【问题描述】:开发人员表示,Bootstrap3将捆绑一个可选主题,使其看起来像Bootstrap2。问题是他们似乎忘记... 查看详情

子控件的 WPF 鼠标悬停触发效果

】子控件的WPF鼠标悬停触发效果【英文标题】:WPFMouseoverTriggerEffectforChildControls【发布时间】:2011-12-0118:47:51【问题描述】:假设我有这段代码:<Window><Window.Resources><Colorx:Key="MyColor"A="255"R="152"G="152"B="152"/><DropShadow... 查看详情

wpf按钮从按钮中删除“模糊”(代码片段)

嗨,我正在尝试在我的wpf中个性化按钮,因为当用户将鼠标悬停在按钮上时,它会显示“默认样式”,如下图所示由于我不希望在按钮中鼠标结束时显示默认的蓝色和边框元素,因此我将此样式创建为我的按钮<Stylex:Key="Simple"T... 查看详情

如何在 WPF 中禁用按钮上的 MouseOver 效果?

】如何在WPF中禁用按钮上的MouseOver效果?【英文标题】:HowdoyoudisableMouseOvereffectsonaButtoninWPF?【发布时间】:2010-11-1612:04:07【问题描述】:我正在尝试在WPF中禁用按钮上的MouseOver效果,或者至少改变它的颜色。我正在使用以下样... 查看详情

wpf xaml 带有图像的按钮,在鼠标上更改颜色如何响应触发器?

】wpfxaml带有图像的按钮,在鼠标上更改颜色如何响应触发器?【英文标题】:wpfxamlButtonwithimage,changecoloronmouseoverhowtorespondtotriggers?【发布时间】:2021-07-2720:59:51【问题描述】:在wpf、xaml中,我一直试图弄清楚当鼠标悬停时如何... 查看详情

幻灯片上的jQuery删除按钮的悬停状态

】幻灯片上的jQuery删除按钮的悬停状态【英文标题】:jqueryonslideremovehoverstateofthebutton【发布时间】:2012-10-0812:12:51【问题描述】:使用Jquery,当您单击按钮时,我可以简单地向下滑动div。问题是,按钮:hover状态没有被移除。JSFID... 查看详情

使用后退按钮从重新访问的页面中删除悬停效果

】使用后退按钮从重新访问的页面中删除悬停效果【英文标题】:Removingahovereffectfromarevisitedpagewithbackbutton【发布时间】:2011-03-1712:16:14【问题描述】:我在这个网站上工作,心里有点刺。当我点击thispage上的便签中的链接,然后... 查看详情

如何使悬停信息气泡出现在 WPF 中的鼠标悬停上?

】如何使悬停信息气泡出现在WPF中的鼠标悬停上?【英文标题】:HowcanImakeahoverinfobubbleappearonmouseoverinWPF?【发布时间】:2010-12-2222:39:48【问题描述】:我想让文本气泡在鼠标悬停在TextBlock上时出现。以下代码是我能得到的最接近... 查看详情

删除在状态栏中显示超链接的超链接/鼠标悬停按钮

】删除在状态栏中显示超链接的超链接/鼠标悬停按钮【英文标题】:Removeshowinghyperlinkinstatusbaronhyperlink/buttononmouseover【发布时间】:2016-09-0103:02:43【问题描述】:在我的应用程序导航器中,状态栏默认显示在每个屏幕的底部,并... 查看详情

IE8 上的鼠标悬停/悬停效果缓慢

】IE8上的鼠标悬停/悬停效果缓慢【英文标题】:Mouseover/hovereffectslowonIE8【发布时间】:2010-12-0408:14:10【问题描述】:我注意到在IE8中使用鼠标悬停事件时有一个奇怪的性能问题,该表有很多行(本例中为100行)。我尝试了很多... 查看详情

鼠标悬停事件的JS问题以显示额外的按钮

...个按钮变得可见以提供更多功能。让我们说“编辑”和“删除”。我遇到了鼠标点击区域的问题。当鼠标实际位于LI元素(灰色背景)上时,鼠标悬停效果很好,但当鼠标悬停在文本或需要单击的实际按钮 查看详情

删除嵌入式 Twitter 小部件上的悬停效果

...edtwitterwidget【发布时间】:2018-03-2615:48:30【问题描述】:如何移除以下嵌入式Twitter小部件上的黑色悬停效果?<aclass="twitter-timeline"href="https://twitter.com/AV_Afrique"data-chrome="noheadernofo 查看详情

wpf按钮背景悬停颜色

】wpf按钮背景悬停颜色【英文标题】:wpfbuttonbackgroundhovercolor【发布时间】:2013-06-2622:04:48【问题描述】:我正在尝试在悬停时更改xaml中按钮样式的背景颜色这是我目前的方法,但它不起作用。正在使用默认的悬停颜色<Stylex:K... 查看详情