Cuando cambio BackColor de un botón de .NET de nuevo a su valor original, no se ve la misma más

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Tengo un botón que quería "flash" brevemente para llamar la atención del usuario. Pensé que la manera más fácil sería cambiar BackColor propiedad de Button a otro color, y luego cambiar de nuevo de nuevo. Así que hago algo como esto:

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

y luego después de un sobre medio un segundo:

myButton.BackColor = this.oldColor;

Pero terminan color de fondo del botón siendo distintamente más oscuro que el resto de los botones en el formulario!

Al principio, pensé que era porque había algo especial en el color original del botón de ser un color con nombre (en este caso, "Control"), pero no lo es.

Lo que es peor, cuando miro a myButton.BackColor en el depurador, consigo

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

¿Qué es exactamente correcto! Pero cuando tomo una captura de pantalla y comprobar el color, no es lo mismo que el resto de los botones!

¿Hay algún tipo de enmascaramiento pasando? O tal vez algún tipo de tramado?

¿Fue útil?

Solución

Me di cuenta de la causa del problema. Resulta que hay otra propiedad (para los botones y TabPages solamente, parece) llamado UseVisualStyleBackColor. Se controla si se usa o no "estilos visuales" al calcular el BackColor. Y para empeorar las cosas, tan pronto como se establece la false, que está establecido en <=>. Así que acaba de terminar de hacer esto:

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

Y cuando esté listo para restablecerlo:

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

(Sí, usted tiene que restablecer el <=> primero, y único conjunto continuación <=>.)

No tengo ni idea de por qué se está utilizando el <=>, o por qué hace lo que hace, pero parece que funciona ahora.

(Gracias, Marc! Yo no he encontrado esto sin su ayuda!)

Otros consejos

Sospecho que la diferencia es que uno es un color ARGB regulares, y uno es un / color conocido sistema.

Controles en .NET un seguimiento de si el color es explícita (conjunto en este control) o heredado. Esto hace que sea difícil cambiar nuevamente de forma correcta ... pero usted podría ser capaz de hacerlo con PropertyDescriptor, así:

    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 poco torpe, pero debería funcionar.

La propiedad UseVisualStyleBackColor del botón determina si el fondo del botón se dibuja con estilos visuales. Cuando la propiedad UseVisualStyleBackColor de un botón se establece en True, la propiedad BackColor se ignora. Cuando la propiedad BackColor se cambia a un color diferente, la propiedad UseVisualStyleBackColor se establece automáticamente en Falso.

Se puede ver este efecto cuando se encuentra en modo de diseño. Crear un botón y cambiar la propiedad BackColor en rojo. A continuación, desplazarse hacia abajo a la propiedad UseVisualStyleBackColor, y observe que se ha establecido en Falso. Si a continuación, establece la propiedad UseVisualStyleBackColor en True, el color del botón cambiará de nuevo al color predeterminado. Cambio de la propiedad UseVisualStyleBackColor volver a Falso cambiará el color del botón de vuelta a rojo.

El programa siguiente muestra este efecto.

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

Gracias a scraimer por publicar su problema y la identificación de la propiedad UseVisualStyleBackColor como el culpert culpable.

O usted podría escribir:

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

Una manera sencilla:

myButton.BackColor = Color.Empty
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top