2009-02-03 1 views
9

Ich habe eine Schaltfläche, die ich kurz "blinken" wollte, um die Aufmerksamkeit des Benutzers zu erhalten. Ich dachte, der einfachste Weg wäre, die Eigenschaft BackColor des Buttons in eine andere Farbe zu ändern und sie dann wieder zurück zu schalten. Also ich etwas wie folgt aus:Wenn ich die BackColor einer .NET-Schaltfläche wieder auf ihren ursprünglichen Wert zurücksetze, sieht es nicht mehr gleich

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 deutlich am Ende wird dunkler als der Rest der Tasten auf dem Formular!

Zuerst dachte ich, es liegt daran, dass die Originalfarbe der Taste etwas Besonderes ist, eine benannte Farbe (in diesem Fall "Control"), aber das ist es nicht.

Was noch schlimmer ist, wenn ich bei myButton.BackColor im Debugger sehen, bekomme ich

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

Welche genau richtig! Aber wenn ich einen Screenshot mache und die Farbe überprüfe, ist es nicht das selbe wie die restlichen Knöpfe!

Gibt es eine Art Maskierung? Oder vielleicht eine Art Dithering?

Antwort

13

Ich fand die Ursache für das Problem. Stellt sich heraus, es gibt eine andere Eigenschaft (nur für Buttons und TabPages scheint es) mit dem Namen UseVisualStyleBackColor. Es steuert, ob "Visual Styles" bei der Berechnung der BackColor verwendet werden soll oder nicht. Und um die Sache noch schlimmer zu machen: Sobald Sie BackColor einstellen, wird es auf false gesetzt. 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, Sie haben die BackColor zuerst zurückgesetzt, und nur dann eingestellt dann UseVisualStyleBackColor)

Ich habe keine Ahnung, warum die UseVisualStyleBackColor verwendet wird, oder warum es tut, was es tut, aber es scheint jetzt zu funktionieren.

(Danke, Marc! Ohne deine Hilfe hätte ich das nicht gefunden!

)
+1

@ Scraimer: +1. Vielen Dank für die Dokumentation dieses Problems. Ich hatte ein ähnliches Problem und habe deinen Beitrag über Google gefunden. –

+0

+1. Habe noch nie von dieser Immobilie gehört. Danke vielmals! – tamberg

3

Ich vermute, der Unterschied ist, dass man eine reguläre argb Farbe hat, und man ist ein System/bekannte Farbe.

Steuerelemente in .NET verfolgen, ob die Farbe explizit (für dieses Steuerelement festgelegt) oder geerbt ist. 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.

+0

Wow. Das ist gruselig! – scraimer

2

Oder Sie könnten nur Typ:

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

Cool! Nun, du lernst jeden Tag etwas Neues. Ich habe es nicht versucht, aber ich werde es nächstes Mal versuchen, wenn ich das brauche. Vielen Dank! – scraimer

0

einfache Art und Weise:

myButton.BackColor = Color.Empty 
+0

Dies funktioniert nicht für mich in .NET 2.0 - kann jemand anderes bestätigen, dass es funktioniert? – scraimer

3

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

Sie können diesen Effekt sehen, wenn Sie sich im Entwurfsmodus befinden. Erstellen Sie eine Schaltfläche und ändern Sie die BackColor-Eigenschaft in rot. Führen Sie dann einen Bildlauf nach unten zu der UseVisualStyleBackColor-Eigenschaft durch, und beachten Sie, dass es auf False festgelegt wurde. Wenn Sie dann die UseVisualStyleBackColor-Eigenschaft auf True festlegen, wird die Schaltflächenfarbe wieder auf die Standardfarbe zurückgesetzt. Durch das Zurücksetzen der Eigenschaft UseVisualStyleBackColor auf False wird die Farbe der Schaltfläche wieder in Rot geändert.

Das folgende Programm demonstriert 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 für die Entsendung seines Problems und zur Bestimmung der UseVisualStyleBackColor Eigenschaft als schuldig culpert scraimer.

Verwandte Themen