2009-02-03 6 views
9

Ho un pulsante che volevo "lampeggiare" brevemente per attirare l'attenzione dell'utente. Ho immaginato che il modo più semplice sarebbe quello di cambiare la proprietà BackColor del pulsante su un altro colore, e quindi riaccenderlo. Così faccio qualcosa di simile:Quando cambio un BackColor di .NET Button al suo valore originale, non sembra più lo stesso

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

e poi, dopo un circa 1/2 di un secondo:

myButton.BackColor = this.oldColor; 

Ma il colore di sfondo del pulsante finiscono per essere distintamente più scuro rispetto al resto dei pulsanti sulla forma!

In un primo momento, ho pensato che fosse perché c'è qualcosa di speciale nel fatto che il colore originale del pulsante è un colore con nome (in questo caso, "Controllo") ma non lo è.

Quel che è peggio, quando guardo myButton.BackColor nel debugger, ottengo

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

Che è esattamente corretto! Ma quando prendo uno screenshot e controllo il colore, non è lo stesso del resto dei pulsanti!

C'è qualche tipo di mascheramento in corso? O forse una sorta di dithering?

risposta

13

Ho scoperto la causa del problema. Si scopre che esiste un'altra proprietà (solo per Pulsanti e Tabulazioni, a quanto pare) denominata UseVisualStyleBackColor. Controlla se utilizzare o meno "Stili visivi" quando si calcola lo BackColor. E per peggiorare le cose, non appena si imposta il BackColor, è impostato su false. Così ho appena finito per fare questo:

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

E quando sono pronto a resettarlo:

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

(. Sì, è necessario ripristinare il BackColor prima, e solo allora impostare UseVisualStyleBackColor)

Non ho idea del motivo per cui viene utilizzato il UseVisualStyleBackColor o perché fa quello che fa, ma sembra funzionare ora.

(Grazie, Marc! Non avrei trovato questo senza il tuo aiuto!)

+1

@scraimer: +1. Grazie per aver documentato questo problema. Ho avuto un problema simile e ho trovato il tuo post tramite Google. –

+0

+1. Mai sentito parlare di questa proprietà prima. Molte grazie! – tamberg

3

Sospetto che la differenza è che uno è un normale colore argb e uno è un sistema/colore noto.

I controlli in .NET tengono traccia di se il colore è esplicito (impostato su questo controllo) o ereditato. Questo rende difficile cambiare di nuovo correttamente ... ma si potrebbe essere in grado di farlo con PropertyDescriptor, in questo modo:

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 po 'goffo, ma dovrebbe funzionare.

+0

Wow. Questo è spaventoso! – scraimer

2

Oppure si può semplicemente digitare:

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

Fantastico! Bene, impari qualcosa di nuovo ogni giorno. Non l'ho provato, ma ci proverò la prossima volta che ne ho bisogno. Grazie! – scraimer

0

modo semplice:

myButton.BackColor = Color.Empty 
+0

Questo non funziona per me in .NET 2.0 - qualcun altro può confermare che funzioni? – scraimer

3

La proprietà UseVisualStyleBackColor del pulsante determina se lo sfondo del pulsante viene disegnato utilizzando gli stili di visualizzazione. Quando la proprietà UseVisualStyleBackColor di un pulsante è impostata su True, la proprietà BackColor viene ignorata. Quando la proprietà BackColor viene modificata in un colore diverso, la proprietà UseVisualStyleBackColor viene automaticamente impostata su False.

È possibile visualizzare questo effetto quando si è in modalità progettazione. Crea un pulsante e modifica la proprietà BackColor in rosso. Quindi scorrere fino alla proprietà UseVisualStyleBackColor e notare che è stato impostato su False. Se si imposta quindi la proprietà UseVisualStyleBackColor su True, il colore del pulsante tornerà al colore predefinito. Passare la proprietà UseVisualStyleBackColor a False cambierà il colore del pulsante in rosso.

Il seguente programma mostra questo effetto.

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 

Grazie a scraimer per la pubblicazione il suo problema e di individuare la proprietà UseVisualStyleBackColor come culpert colpevole.

Problemi correlati