90 votes

Comment supprimer l'effet de survol par défaut des boutons WPF ?

Mon problème est que, dans WPF, lorsque j'essaie de modifier la couleur de l'arrière-plan d'un bouton à l'aide de déclencheurs ou d'animations, l'effet par défaut du passage de la souris (gris avec une lueur orange) semble avoir la priorité.

Après de nombreuses recherches, je ne sais pas comment supprimer cet effet.

Une aide ?

Merci,

Neil

117voto

dodgy_coder Points 2778

Cette solution est similaire à celle mentionnée par Mark Heath, mais avec moins de code pour créer un bouton très basique, sans l'effet d'animation intégré au passage de la souris. Elle préserve un effet simple de survol de la souris en affichant la bordure du bouton en noir. Le style peut être inséré dans la section Window.Resources ou UserControl.Resources par exemple (comme indiqué).

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

2 votes

J'aime beaucoup cette solution. Cependant, les déclencheurs de survol de la souris ne s'activent que lorsque la souris se trouve sur le texte du bouton. J'ai ajouté un bloc de texte avec une largeur spécifiée à l'intérieur du bouton pour résoudre ce problème.

2 votes

Vous êtes un saint.

28voto

Lyall Points 71

Pour ajouter une solution très simple, cela m'a suffi, et j'ai pensez à répond au problème de l'OP. J'ai utilisé la solution dans cette réponse sauf avec une Background au lieu d'une image.

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

Pas de re-réflexion au-delà du fait de forcer le Background pour toujours être le Transparent l'arrière-plan du bouton modèle - le passage de la souris n'affecte plus l'arrière-plan une fois que cela est fait. Remplacez évidemment Transparent avec n'importe quelle valeur préférée.

18voto

Mark Heath Points 22240

Vous devez créer votre propre modèle de bouton personnalisé pour avoir un contrôle total sur l'apparence dans tous les états. Voici un modèle de tutoriel .

2 votes

Merci, c'était parfait. C'était plus compliqué à faire que je ne le pensais, mais tout fonctionne bien maintenant.

26 votes

Pour une raison quelconque, il y a 100 réponses sur la création de modèles personnalisés pour les contrôles WPF, et elles sont toutes inutilement fausses. Il n'y a aucune raison de se battre pour écrire 50 lignes de code de modèle pour un bouton afin de changer une seule chose. Tout ce que vous avez à faire est de faire un clic droit sur le contrôle dans le designer xaml et de créer une copie du code du modèle. VS créera un style à partir de ce bouton exact et vous pourrez le modifier à partir de là. Cela prend littéralement 2 secondes.

0 votes

@TheMuffinMan Fantastique, mais ne trouvez-vous pas un tant soit peu étrange qu'il faille 50 lignes de code de modèle pour empêcher un bouton de changer la couleur d'arrière-plan au passage de la souris ? WPF est un framework stupidement trop compliqué.

13voto

Benji-Man Points 121

L'homme aux muffins avait une réponse très simple qui a fonctionné pour moi.

Pour ajouter une orientation un peu plus spécifique, du moins pour VS 2013 :

  • Cliquez avec le bouton droit de la souris sur le contrôle
  • Sélectionnez Editer le modèle => Editer une copie...
  • J'ai sélectionné "Application" pour l'endroit où enregistrer le style.
    • À partir de là, vous pouvez directement éditer App.xaml et voir les propriétés nommées intuitivement. Pour mes besoins, j'ai juste défini RenderMouseOver="False".
  • Ensuite, dans le fichier MainWindow.xaml ou à l'endroit où se trouve votre interface graphique, vous pouvez coller le nouveau style à la fin de la balise Button, par exemple. ... Style="{DynamicResource MouseOverNonDefault}"/>

0 votes

Qui est l'homme aux muffins ?

0 votes

LOL. Il a fait la deuxième réponse à la question-propriétaire-réponse acceptée. Je ne savais pas si vous demandiez sérieusement ou si vous plaisantiez. Difficile à dire avec un nom comme Muffin Man.

9voto

Arash.Zandi Points 96

Ce lien m'a beaucoup aidé http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/

Définir un style dans UserControl.Resources ou Ressources de la fenêtre

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

Ajoutez ensuite le style à votre bouton de la manière suivante 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X