Als ich eine .NET-Taste der Backcolor zurück auf den ursprünglichen Wert zu ändern, sieht es nicht den gleiche mehr
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?
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