Quando cambio BackColor di un pulsante NET torna al suo valore originale, non sembra più la stessa

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

  •  21-08-2019
  •  | 
  •  

Domanda

Ho un bottone che ho voluto "flash" per breve tempo per ottenere l'attenzione dell'utente. Ho pensato che il modo più semplice sarebbe quella di cambiare BackColor proprietà di Button in un altro colore, e quindi passare di nuovo. Così faccio qualcosa di simile a questo:

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 sul modulo!

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

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

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

Il che è esattamente corretto! Ma quando prendo uno screenshot, e controllare il colore, non è la stessa come il resto dei pulsanti!

C'è una sorta di nastro succedendo? O forse un qualche tipo di dithering?

È stato utile?

Soluzione

ho capito la causa del problema. Risulta c'è un altro terreno (per Pulsanti e TabPages solo, a quanto pare) di nome UseVisualStyleBackColor. Esso verifica se utilizzare o meno "Stili visivi" nel calcolo del BackColor. E come se non bastasse, non appena si imposta la false, è impostato su <=>. 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 <=> prima, e solo allora impostare <=>).

Non ho idea del motivo per cui si usa il <=>, o perché fa quello che fa, ma sembra funzionare ora.

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

Altri suggerimenti

Ho il sospetto che la differenza è che uno è un colore ARGB regolare, e uno è un / colore noto sistema.

Controlli a .NET tenere 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.

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 modificato in un colore diverso, la proprietà UseVisualStyleBackColor viene automaticamente impostata su False.

Si può vedere questo effetto quando si è in modalità di progettazione. Creare un pulsante e modificare la proprietà BackColor al rosso. Poi scorrere verso il basso per la proprietà UseVisualStyleBackColor, e si noti che è stato impostato su False. Se poi si imposta la proprietà UseVisualStyleBackColor su True, il colore del pulsante cambierà di nuovo al colore predefinito. Commutazione la proprietà UseVisualStyleBackColor indietro su False cambierà il colore del pulsante di nuovo al rosso.

Il seguente programma illustra 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.

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

Un modo semplice:

myButton.BackColor = Color.Empty
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top