Als ich eine .NET-Taste der Backcolor zurück auf den ursprünglichen Wert zu ändern, sieht es nicht den gleiche mehr

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

  •  21-08-2019
  •  | 
  •  

Frage

Ich habe eine Schaltfläche, die ich kurz auf „Blitz“, wollte die Aufmerksamkeit des Benutzers erhalten. Ich dachte, der einfachste Weg wäre, die BackColor Eigenschaft in einer anderen Farbe der Schaltfläche zu ändern, und dann wieder zurückschalten. Also ich etwas tun, wie folgt aus:

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

und dann nach einer etwa 1/2 Sekunde:

myButton.BackColor = this.oldColor;

Aber die Hintergrundfarbe der Schaltfläche am Ende als deutlich dunkler als der Rest der Tasten auf dem Formular!

Zuerst dachte ich, es war, weil es etwas Besonderes über die ursprüngliche Farbe der Schaltfläche eine benannte Farbe zu sein (in diesem Fall „Control“), aber es ist nicht.

Was ist schlimmer, als ich bei myButton.BackColor im Debugger sehen, ich

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

Das ist genau richtig! Aber wenn ich einen Screenshot, und überprüfen Sie die Farbe, es ist nicht das gleiche wie der Rest der Tasten!

Gibt es irgendeine Art von Maskierung los? Oder vielleicht eine Art von Dithering?

War es hilfreich?

Lösung

dachte ich, die Ursache für das Problem aus. Es stellte sich heraus eine andere Eigenschaft gibt es (für Buttons und TabPages nur, wie es scheint) genannt UseVisualStyleBackColor. Er kontrolliert, ob oder nicht verwenden „Visual Styles“, wenn die BackColor Berechnung. Und noch schlimmer zu machen, sobald Sie den BackColor gesetzt, ist es auf false. So landete ich nur auf dies zu tun:

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

Und wenn ich bin bereit, es zurücksetzen:

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

(Ja, haben Sie die BackColor zuerst zurückgesetzt und erst dann eingestellt UseVisualStyleBackColor.)

Ich habe keine Ahnung, warum der UseVisualStyleBackColor verwendet wird, oder warum es das tut, was es tut, aber es scheint jetzt zu arbeiten.

(Danke, Marc! Ich würde dies ohne Ihre Hilfe nicht gefunden haben!)

Andere Tipps

Ich vermute, dass der Unterschied ist, dass man eine regelmäßige ARGB-Farbe ist, und man ist ein System / bekannt Farbe.

Steuerelemente in .NET nachverfolgen, ob die Farbe ist explizit (Satz auf dieser Kontrolle) oder vererbt. Das macht es schwer, wieder richtig zu ändern ... aber Sie könnten es tun können mit PropertyDescriptor, etwa so:

    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);
    }

Ein bisschen klobig, aber es sollte funktionieren.

Die UseVisualStyleBackColor Eigenschaft Taste bestimmt, ob der Hintergrund der Schaltfläche visuelle Stile gezeichnet wird. Wenn die UseVisualStyleBackColor Eigenschaft einer Schaltfläche auf True gesetzt ist, wird die Backcolor-Eigenschaft ignoriert. Wenn die Backcolor-Eigenschaft auf eine andere Farbe geändert wird, wird die UseVisualStyleBackColor Eigenschaft auf False automatisch eingestellt.

Sie können diesen Effekt sehen, wenn Sie im Entwurfsmodus sind. Erstellen Sie eine Schaltfläche und ändern Sie die Backcolor-Eigenschaft auf rot. Dann blättern Sie zu der UseVisualStyleBackColor Eigenschaft nach unten, und beachten Sie, dass es auf False festgelegt wurde. Wenn Sie dann die UseVisualStyleBackColor Eigenschaft auf True gesetzt ist, wird die Schaltfläche Farbe auf die Standardfarbe ändern zurück. Umschalten der UseVisualStyleBackColor Eigenschaft zurück auf False wird die Taste rote Farbe ändern zurück.

Das folgende Programm zeigt diesen Effekt.

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

Dank scraimer für sein Problem zu veröffentlichen und die UseVisualStyleBackColor Eigenschaft als schuldig culpert identifizieren.

Oder Sie könnten nur eingeben:

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();

Einfache Art und Weise:

myButton.BackColor = Color.Empty
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top