Quand je change un BackColor Button .NET à sa valeur d'origine, il ne semble pas la même plus

StackOverflow https://stackoverflow.com/questions/506641

  •  21-08-2019
  •  | 
  •  

Question

J'ai un bouton que je voulais brièvement « flash » pour attirer l'attention de l'utilisateur. Je me suis le plus simple serait de passer à une autre couleur, puis mettez-le à nouveau la propriété de BackColor le bouton. Alors je fais quelque chose comme ceci:

this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;

, puis après une seconde environ 1/2:

myButton.BackColor = this.oldColor;

Mais la fin de la couleur de fond du bouton jusqu'à être distinctement plus sombre que le reste des boutons sur le formulaire!

Dans un premier temps, je pensais que c'était parce qu'il ya quelque chose de spécial couleur d'origine du bouton étant une couleur nommée (dans ce cas, « Control »), mais il n'est pas.

Ce qui est pire, quand je regarde dans le débogueur myButton.BackColor, je reçois

{Name=Control, ARGB=(255, 236, 233, 216)}

Ce qui est tout à fait correct! Mais quand je prends une capture d'écran, et vérifier la couleur, il n'est pas la même chose que le reste des boutons!

Y at-il une sorte de masquage passe? Ou peut-être une sorte de tergiversations?

Était-ce utile?

La solution

Je me suis dit la cause du problème. Turns out il y a une autre propriété (pour les boutons et TabPages seulement, il semble) nommé UseVisualStyleBackColor. Il contrôle si oui ou non utiliser « Styles visuels » lors du calcul du BackColor. Et pour empirer les choses, dès que vous réglez le false, il est réglé sur <=>. Donc, je viens fini par faire ceci:

this.oldUseVisualStyleBackColor = myButton.UseVisualStyleBackColor;
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;

Et quand je suis prêt à le réinitialiser:

myButton.BackColor = this.oldColor;
myButton.UseVisualStyleBackColor = this.oldUseVisualStyleBackColor;

(Oui, vous devez réinitialiser le premier <=>, et seulement ensuite définir <=>).

Je ne sais pas pourquoi le est utilisé <=>, ou pourquoi il fait ce qu'il fait, mais il semble fonctionner maintenant.

(Merci, Marc, je ne l'aurais pas trouvé cela sans votre aide!)

Autres conseils

Je soupçonne que la différence est que l'on est une couleur régulière ARVB, et celui-ci est un système / couleur connu.

Les contrôles dans .NET garder une trace si la couleur est explicite (ensemble sur ce contrôle) ou héritées. Cela rend difficile de revenir correctement ... mais vous pourriez être en mesure de le faire avec PropertyDescriptor, comme ceci:

    TextBox tb = new TextBox();
    tb.BackColor = Color.Red;
    // now set it back to inherited
    PropertyDescriptor prop = TypeDescriptor.GetProperties(tb)["BackColor"];
    if (prop.CanResetValue(tb))
    {
        prop.ResetValue(tb);
    }

Un peu maladroit, mais il devrait fonctionner.

La propriété UseVisualStyleBackColor du bouton détermine si l'arrière-plan du bouton est dessiné à l'aide des styles visuels. Lorsque la propriété UseVisualStyleBackColor d'un bouton est définie sur True, la propriété BackColor est ignorée. Lorsque la propriété BackColor est remplacée par une couleur différente, la propriété UseVisualStyleBackColor est automatiquement définie sur False.

Vous pouvez voir cet effet lorsque vous êtes en mode de conception. Créer un bouton et modifier la propriété BackColor rouge. Ensuite, faites défiler jusqu'à la propriété UseVisualStyleBackColor, et notez qu'il a été défini sur False. Si vous définissez la propriété UseVisualStyleBackColor sur True, la couleur du bouton revenir à la couleur par défaut. Commutation de la propriété UseVisualStyleBackColor Retour à False va changer la couleur du bouton de retour au rouge.

Le programme suivant illustre cet effet.

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Button1.BackColor = Color.Red
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Button1.UseVisualStyleBackColor = Not Button1.UseVisualStyleBackColor
End Sub

Merci à scraimer pour l'affichage de son problème et identifier la propriété UseVisualStyleBackColor comme culpert coupable.

Ou vous pouvez simplement taper:

TextBox tb = new TextBox();
//Change the Backcolor
tb.BackColor = Color.Red;
//Resets the Backcolor to its default value, its pretty strange that you don't see the method but it works with allmost all properties
tb.ResetBackColor();

Une façon simple:

myButton.BackColor = Color.Empty
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top