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 un Trigger
dans le style par défaut pour le Button
, qui est basé sur la IsMouseOver
propriété et définit les propriétés Background
et BorderBrush
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 la Button.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 le Button
plutôt que pour le Background
. Si vous avez besoin de contenu supplémentaire sur le graphique, vous pouvez les combiner avec un Grid
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:
- Lors de la modification de votre XAML, sélectionnez l' onglet "Conception" .
- Dans l' onglet "Conception" , recherchez le bouton dont vous souhaitez désactiver l'effet.
- Cliquez avec le bouton droit sur ce bouton et choisissez "Modifier le modèle / Modifier une copie ..." . Sélectionnez dans l'invite que vous obtenez où vous voulez que la nouvelle ressource de modèle soit placée. Cela semblera ne rien faire, mais en fait, le concepteur aura ajouté de nouvelles ressources là où vous l'avez indiqué et modifié votre élément de bouton pour référencer le style qui utilise ces ressources comme modèle de bouton.
- Maintenant, vous pouvez modifier ce style. Le plus simple est de supprimer ou de commenter (par exemple Ctrl+ E, C) l'
<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:
<p:Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<p:Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
</Trigger>-->
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
(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.
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é.