visual pasar hacer forma como color clic cambiar boton .net button backcolor

pasar - Cuando cambio BackColor de un botón.NET a su valor original, ya no se ve igual



como cambiar el color a un boton en visual basic (5)

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

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

y luego después de aproximadamente 1/2 por segundo:

myButton.BackColor = this.oldColor;

¡Pero el color de fondo del botón es claramente más oscuro que el resto de los botones en el Formulario!

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

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

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

¡Lo cual es exactamente correcto! Pero cuando tomo una captura de pantalla y verifico el color, ¡no es lo mismo que el resto de los botones!

¿Hay algún tipo de enmascaramiento? ¿O tal vez algún tipo de vacilación?


Descubrí la causa del problema. Resulta que hay otra propiedad (para Buttons y TabPages solamente, parece) llamada UseVisualStyleBackColor . Controla si se usan o no "Estilos visuales" al calcular BackColor . Y para empeorar las cosas, tan pronto como configura el BackColor , se establece en false . Así que terminé haciendo esto:

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

Y cuando esté listo para reiniciarlo:

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

(Sí, debe restablecer BackColor primero, y solo luego establecer UseVisualStyleBackColor ).

No tengo idea de por UseVisualStyleBackColor se usa UseVisualStyleBackColor , o por qué hace lo que hace, pero parece funcionar ahora.

(¡Gracias, Marc! ¡No habría encontrado esto sin tu ayuda!)


Sospecho que la diferencia es que uno es un color argb regular, y uno es un sistema / color conocido.

Los controles en .NET llevan un registro de si el color es explícito (establecido en este control) o heredado. Esto hace que sea difícil volver a cambiar correctamente ... pero es posible que puedas 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.


O simplemente puede 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();


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

Puedes ver este efecto cuando estás en modo de diseño. Cree un botón y cambie la propiedad BackColor a rojo. A continuación, desplácese hacia abajo a la propiedad UseVisualStyleBackColor y observe que se ha establecido en False. Si luego establece la propiedad UseVisualStyleBackColor en True, el color del botón volverá al color predeterminado. Cambiar la propiedad UseVisualStyleBackColor a False volverá a cambiar el color del botón a rojo.

El siguiente programa demuestra 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 e identificar la propiedad UseVisualStyleBackColor como culpable culpert.


Manera simple:

myButton.BackColor = Color.Empty