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

Nel*_*ius 77 wpf mouseover button

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

经过广泛的搜索后,我对如何消除这种影响毫无头绪.

dod*_*der 102

这类似于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>
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢这个解决方案。但是,鼠标悬停触发器仅在鼠标悬停在按钮上的文本上时激活。我在按钮内添加了一个指定宽度的文本块来解决这个问题。 (2认同)
  • 先生您是一位圣人。 (2认同)

Lya*_*all 22

只是添加一个非常简单的解决方案,这对我来说已经足够了,我认为解决OP的问题.我在这个答案中使用了解决方案,除了使用常规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>
Run Code Online (Sandbox Code Playgroud)

除了强制Background始终是Transparent模板化按钮的背景之外没有重新模板 - 一旦完成,鼠标悬停不再影响背景.显然可以替换Transparent任何首选值.


Mar*_*ath 15

您需要创建自己的自定义按钮模板,以完全控制所有状态下的外观.这是一个教程.

  • 出于某种原因,有关于为WPF控件创建自定义模板的100个答案,并且它们都是不必要的错误.没有理由为一个按钮编写50行模板代码以便改变1件事.您只需在xaml设计器中右键单击该控件并创建模板代码的副本即可.VS将从该确切按钮创建一个样式,您可以从那里调整它.从字面上讲2秒. (8认同)
  • 谢谢,这是完美的.这比我想象的要复杂得多,但现在一切都很好. (2认同)

小智 8

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

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

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


Ara*_*ndi 7

这个链接帮了我很多 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>
Run Code Online (Sandbox Code Playgroud)

然后以这种方式将样式添加到您的按钮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>
Run Code Online (Sandbox Code Playgroud)