Mi problema es que en WPF, cada vez que intento cambiar el color del fondo de un botón usando activadores o animaciones, el efecto de mouse over predeterminado (de ser gris con ese brillo naranja) parece tener prioridad.
Después de extensas búsquedas, no tengo ni idea de cómo eliminar este efecto.
Esto es similar a la solución a la que se refiere Mark Heath, pero no tiene tanto código para crear un botón muy básico, sin el efecto de animación del mouse incorporado. Conserva un simple efecto de pasar el ratón por encima de mostrar el borde del botón en negro.
El estilo se puede insertar en la sección Window.Resources o UserControl.Resources, por ejemplo (como se muestra).
<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>
fuente
Solo para agregar una solución muy simple, eso fue lo suficientemente bueno para mí, y creo que aborda el problema del OP. Usé la solución en esta respuesta, excepto con un
Background
valor regular en lugar de una imagen.<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>
No hay que volver
Background
a crear plantillas más allá de forzar a que siempre sea elTransparent
fondo del botón de la plantilla; el mouseover ya no afecta el fondo una vez hecho esto. Obviamente reempláceloTransparent
con cualquier valor preferido.fuente
El Muffin Man tenía una respuesta muy simple que funcionó para mí.
Para agregar una dirección un poco más específica, al menos para VS 2013:
... Style="{DynamicResource MouseOverNonDefault}"/>
fuente
Este enlace me ayudó mucho http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/
Defina un estilo en UserControl.Resources o Window.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>
Luego agregue el estilo a su botón de esta manera 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>
fuente
Si alguien no quiere anular la plantilla de control predeterminada, aquí está la solución.
Puede crear DataTemplate para el botón que puede tener TextBlock y luego puede escribir el activador de propiedad en la propiedad IsMouseOver para deshabilitar el efecto del mouse sobre el. La altura de TextBlock y Button debe ser la misma.
<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>
fuente
Una extensión en la respuesta de dodgy_coder que agrega soporte para ..
Agrega soporte para IsSelected y hover, es decir, un botón conmutado
<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>
ejemplos ..
<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />
fuente
Usando un activador de plantilla:
<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>
fuente