如何删除WPFbutton上的默认鼠标hover效果?

我的问题是,在WPF中,每当我尝试使用触发器或animation更改button背景的颜色时,默认的鼠标hover效果(与橙色发光呈灰色)似乎优先。

经过广泛的search,我很无知,如何消除这种影响。

您需要创build您自己的自定义button模板以全面控制所有状态的外观。 这是一个教程 。

这与Mark Heath提到的解决scheme类似,但没有太多的代码来创build一个非常基本的button,没有内置的鼠标hoveranimation效果。 它保留了一个简单的鼠标在黑色显示button边框的效果。 例如,样式可以插入到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> 

只是为了添加一个非常简单的解决scheme,这对我来说已经足够了,我解决OP的问题。 我在这个答案中使用的解决scheme,除了一个常规的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以外,没有任何重新模板总是从模板化button的Transparent背景 – 一旦完成,鼠标hover不再影响背景。 显然用任何首选值代替Transparent

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

您可以为可以具有TextBlock的button创buildDataTemplate,然后您可以在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> 

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

  • 保持WPFbutton样式
  • 添加对IsSelected和hover的支持,即切换的button

      <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" />

使用模板触发器:

 <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> 

松饼人有一个非常简单的答案,为我工作。

要添加一个更具体的方向,至less在VS 2013:

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