J'ai un bouton sur ma page avec ce XAML:
<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Bottom"
Width="50" Height="50" HorizontalContentAlignment="Left"
BorderBrush="{x:Null}" Foreground="{x:Null}" Margin="50,0,0,0">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="Green"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Mais lorsque je place la souris sur mon bouton, l'arrière-plan du bouton change en arrière-plan gris par défaut.
Quel est le problème?
Voici l'image du bouton avant et après le survol de la souris:
Avant:
Après:
Forward-48.png
et déclencher IsMouseOver pour la changer pour la même choseForward-48.png
. J'essaie d'utiliser votre code avec différentes images et j'ai tout bien fonctionné.Réponses:
Pour supprimer le
MouseOver
comportement par défaut sur le,Button
vous devrez modifier leControlTemplate
. Changer votreStyle
définition comme suit devrait faire l'affaire:EDIT: Il y a quelques années de retard, mais vous pouvez en fait définir le pinceau de bordure à l'intérieur de la bordure qui s'y trouve. Idk si cela a été signalé mais il ne semble pas que ce soit le cas ...
la source
ControlTemplate
, donc ils remplacent lesStyle
déclencheurs d'OP .ControlTemplate
dit essentiellement «Peignez la bordure en fonction de laBackground
couleur. Et si la souris est au-dessus du bouton - peignez cette bordure de cette couleur à la place, alors que dans le style, vous n'avez accès qu'à laBackground
couleur, et non à la couleur de bordure sous-jacente. Je vois que vous faites remarquer cependant, le style WPF laisse beaucoup à désirer ...Toutes les réponses jusqu'à présent impliquent de remplacer complètement le comportement par défaut du bouton par autre chose. Cependant, à mon humble avis, il est utile et important de comprendre qu'il est possible de changer uniquement la partie qui vous intéresse , en modifiant le modèle par défaut existant pour un élément XAML.
Dans le cas de la gestion de l'effet de survol sur un bouton WPF, le changement d'apparence dans un
Button
élément WPF est causé par unTrigger
dans le style par défaut pour leButton
, qui est basé sur laIsMouseOver
propriété et définit les propriétésBackground
etBorderBrush
de l'Border
élément de niveau supérieur dans le modèle de contrôle. L'Button
arrière-plan de l'Border
élément est sous l'arrière-plan de l' élément, donc la modification de laButton.Background
propriété n'empêche pas l'effet de survol d'être vu.Avec un peu d'effort, vous pouvez remplacer ce comportement avec votre propre setter, mais comme l'élément que vous devez affecter est dans le modèle et n'est pas directement accessible dans votre propre XAML, cette approche serait difficile et à mon humble avis trop complexe.
Une autre option serait d'utiliser le graphique comme
Content
pour leButton
plutôt que pour leBackground
. Si vous avez besoin de contenu supplémentaire sur le graphique, vous pouvez les combiner avec unGrid
comme objet de niveau supérieur dans le contenu.Cependant, si vous souhaitez littéralement désactiver complètement l'effet de survol (plutôt que simplement le masquer), vous pouvez utiliser le concepteur Visual Studio XAML:
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
élément. Bien entendu, vous pouvez apporter les modifications souhaitées au modèle à ce stade.Lorsque vous avez terminé, le style du bouton ressemblera à ceci:
(Remarque: vous pouvez omettre les
p:
qualifications d'espace de noms XML dans le code réel ... Je les fournis ici uniquement parce que le formateur de code XML de Stack Overflow est confondu par des<Style/>
éléments qui n'ont pas de nom complet avec un espace de noms XML.)Si vous souhaitez appliquer le même style à d'autres boutons, vous pouvez simplement cliquer dessus avec le bouton droit de la souris et choisir "Modifier le modèle / Appliquer la ressource" et sélectionner le style que vous venez d'ajouter pour le premier bouton. Vous pouvez même faire de ce style le style par défaut pour tous les boutons, en utilisant les techniques normales pour appliquer un style par défaut aux éléments en XAML.
la source
Cela a bien fonctionné pour moi.
Style de bouton
Bouton
Remarques
la source
Stroke
couleur enBorder
survolant le, sans qu'il ne survole uniquement lePath
?x:Key="TransparentStyle"
partie et l'utilisation étaient importantes pour moi pour y arriver ... Merci!Je veux juste partager mon style de bouton de mon ResourceDictionary que j'utilise. Vous pouvez modifier librement l'arrière-plan onHover au niveau des déclencheurs de style. " ColorAnimation To = * votre BG souhaité (c'est-à-dire # FFCEF7A0)". Le bouton BG reviendra également automatiquement à sa BG d'origine après l'état mouseOver.Vous pouvez même définir la vitesse de transition.
Dictionnaire des ressources
tout ce que vous avez à faire est d'appeler le style.
Exemple d'implémentation
la source
Une réponse légèrement plus difficile qui utilise ControlTemplate et a un effet d'animation (adapté de https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/customizing-the-appearance-of-an-existing- contrôle )
Dans votre dictionnaire de ressources, définissez un modèle de contrôle pour votre bouton comme celui-ci:
dans votre XAML, vous pouvez utiliser le modèle ci-dessus pour votre bouton comme ci-dessous:
Définissez votre bouton
J'espère que ça aide
la source
Pour changer le style du bouton
1er: définir les styles de ressources
2e définir le code du bouton
3ème code derrière
la source