éclaircir la couleur de fond sur le clic du bouton par reliure avec convertisseur

Je veux éclaircir un fond de boutons au clic. Alors j’ai fait ce qui suit:

 

               ...      

Le convertisseur:

 class ColorLightConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Color color = (Color)value; System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B)); return Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

Mais le convertisseur n’est pas appelé lorsque je clique sur le bouton. Je pense qu’il y a un problème avec la liaison, mais je ne vois pas l’erreur …

Pouvez-vous m’aider?

Peut-être que je me trompe complètement. Ce que je veux fondamentalement faire: Lorsque vous cliquez sur le bouton, prenez la couleur d’arrière-plan actuelle et l’éclaircissez. Pas plus…

Mise à jour 1:

J’ai essayé ce qui suit:

Modification de la liaison un peu:

    

Changé le convertisseur (maintenant il retourne un SolidColorBrush):

 class ColorLightConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Color color = (Color)value; System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B)); return new SolidColorBrush(Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B)); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

Maintenant, le convertisseur est appelé, mais il est appelé encore et encore, ainsi une exception stackoverflow est levée après quelques secondes. D’où vient cette boucle indéfinie? Je suis vraiment un peu confus pour le moment …

Vous ne devriez pas utiliser System.Drawing.Color sur WPF. Utilisez plutôt System.Windows.Media.Color. Une autre chose importante est que les Setters à l’intérieur de ControlTemplate.Triggers n’ont pas à référencer le contrôle à l’aide de RelativeSource TemplatedParent. Juste:

    

Et garder le rest le même. Maintenant, si vous avez besoin de spécifier une logique personnalisée (un convertisseur, par exemple), placez-le simplement dans ce setter.

Edit: La boucle infinie provient du fait que vous êtes Binding to Background.Color, puis de Setting Background, ce qui déclenche une notification de modification de propriété dans le système de propriétés WPF, ce qui entraîne l’actualisation de la liaison, etc. .. Je pense que vous pourrez peut-être contourner ce problème en définissant le mode de liaison sur = OneTime.

J’ai utilisé le style suivant pour Button. cela peut vous aider.

   

Le problème est avec Background, je ne sais pas exactement pourquoi de toutes les propriétés, background agit toujours de cette façon, mais si vous définissez Template au lieu de Background, le problème est résolu: