Toutes les réponses proposées jusqu'à présent impliquent de remplacer complètement le comportement du bouton par défaut par quelque chose d'autre. Cependant, il est utile et important de comprendre qu'il est possible de modifier le comportement des boutons par défaut. juste la partie qui vous intéresse en modifiant le modèle par défaut existant d'un élément XAML.
Dans le cas du traitement de l'effet de survol d'un bouton WPF, le changement d'apparence dans un WPF Button
est causé par un Trigger
dans le style par défaut de la Button
qui est basé sur le IsMouseOver
et définit la propriété Background
y BorderBrush
des propriétés du niveau supérieur Border
dans le modèle de contrôle. Le site Button
se trouve sous l'arrière-plan de l'élément Border
donc la modification de l'arrière-plan de l'élément Button.Background
n'empêche pas de voir l'effet de survol.
Avec un peu d'effort, vous pourriez remplacer ce comportement par votre propre setter, mais comme l'élément que vous devez affecter se trouve dans le modèle et n'est pas directement accessible dans votre propre XAML, cette approche serait difficile et, à mon avis, trop complexe.
Une autre option consisterait à utiliser le graphique comme le Content
pour le Button
plutôt que le Background
. Si vous avez besoin d'un contenu supplémentaire par rapport au graphique, vous pouvez les combiner avec une Grid
comme objet de premier niveau dans le contenu.
Toutefois, si vous souhaitez simplement désactiver entièrement l'effet de survol (au lieu de simplement le masquer), vous pouvez utiliser le concepteur XAML de Visual Studio :
- Pendant l'édition de votre XAML, sélectionnez l'option "Design" onglet.
- Dans le "Design" recherchez le bouton pour lequel vous souhaitez désactiver l'effet.
- Cliquez à droite sur ce bouton, et choisissez "Modifier le modèle/Éditer une copie..." . Sélectionnez dans l'invite qui s'affiche l'endroit où vous souhaitez placer la nouvelle ressource de modèle. Cette opération semble ne rien faire, mais en fait, le concepteur aura ajouté de nouvelles ressources à l'endroit que vous lui avez indiqué et modifié votre élément de bouton pour qu'il fasse référence au style qui utilise ces ressources comme modèle de bouton.
- Maintenant, vous pouvez aller éditer ce style. Le plus simple est de supprimer ou de commenter (par ex. Ctrl + E , C ) le
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
élément. Bien entendu, vous pouvez apporter toutes les modifications que vous souhaitez au modèle à ce stade.
Lorsque vous aurez terminé, le style du bouton ressemblera à quelque chose comme 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>
(Note : vous pouvez omettre le p:
Les qualifications de l'espace de nom XML dans le code réel Je les fournis ici uniquement parce que le formateur de code XML de Stack Overflow s'embrouille dans les cas suivants <Style/>
qui n'ont pas un nom entièrement qualifié avec un espace de noms XML).
Si vous souhaitez appliquer le même style à d'autres boutons, il vous suffit de cliquer avec le bouton droit de la souris sur ces derniers et de choisir "Modifier le modèle/appliquer la ressource" et sélectionnez le style que vous venez d'ajouter pour le premier bouton. Vous pouvez même faire de ce style le style par défaut de tous les boutons, en utilisant les techniques habituelles pour appliquer un style par défaut aux éléments dans XAML.