2011-05-14 12 views
8

Durante la creación de mi increíble juego de combinación;) encontré un problema que está completamente fuera del alcance.Color del texto del control deshabilitado - cómo cambiarlo

Cuando el jugador elige dos etiquetas con símbolos, quiero bloquear todas las demás etiquetas durante 4 segundos.

Pero cuando hago eso, el color anterior de todas las etiquetas cambia a gris y los símbolos son visibles. Mi pregunta es: ¿hay algún método para cambiar el ForeColor de una etiqueta deshabilitada en la imagen visual C#?

El proyecto es una aplicación WinForm.

En el momento en que puse el color de una etiqueta de código de esta manera:

label1.ForeColor = lable1.BackColor; 

Cuando el usuario hace clic en la etiqueta lo cambio a:

lable1.ForeColor = Color.Black; 
+3

¿Qué tipo de proyecto? WinForms, WPF, ASP.NET? –

+0

¿Cómo se establece el color en este momento? ¿Puedes publicar tu código? – Oded

+4

Las etiquetas están ** siempre ** "bloqueadas", al menos en el sentido de que los usuarios no pueden editar su texto ni manipularlo. No es necesario deshabilitarlos para obtener ese efecto. –

Respuesta

7

Camino simple que tratar cambiar la forma en que Windows dibuja los controles deshabilitados es simplemente establecer un indicador cuando quiere que el Label esté efectivamente "deshabilitado", y luego verificar el valor de ese indicador en su método de controlador de eventos Click antes de tomar w toda acción que quieras Si el control ha sido "deshabilitado", entonces no realice ninguna acción.

Algo como esto:

private bool labelDisabled = false; 

private void myLabel_Click(object sender, EventArgs e) 
{ 
    if (!labelDisabled) 
    { 
     this.ForeColor = SystemColors.ControlText; 
    } 
} 

También, nota que siempre se debe utilizar el SystemColors en lugar de algo así como Color.Black.
Si codifica valores de color específicos, a menudo entrarán en conflicto cuando el usuario personalice su tema predeterminado de Windows. Raymond Chen discute los peligros de esto en un artículo en su blog.

+0

Gracias fue genial y simple – Mqati

+7

Solo un comentario sobre el consejo de "siempre use SystemColors" - Diría que debería ser siempre o nunca - como en, hardcode todos los colores para todo o ninguno de ellos. A veces quieres controlar el aspecto de las cosas tú mismo en lugar de ser un esclavo del tema de Windows. Pero no los mezcles, es cuando obtienes cosas conflictivas. –

+1

Sí, definitivamente es un asunto de "todo o nada". Pero no estoy de acuerdo con su fraseo "esclavo del tema de Windows". Ayuda si lo piensas como "esclavo de las preferencias de tu usuario". Una buena idea. –

8

Basta con crear su propia etiqueta con un evento de pintura redefinido:

protected override void OnPaint (System.Windows.Forms.PaintEventArgs e) 
{ 
    if (Enabled) 
    { 
     //use normal realization 
     base.OnPaint (e); 
     return; 
    } 
    //custom drawing 
    using (Brush aBrush = new SolidBrush("YourCustomDisableColor")) 
    { 
     e.Graphics.DrawString(Text, Font, aBrush, ClientRectangle); 
    } 
} 

tener cuidado con las banderas de formato de texto durante la extracción de texto.

+0

Para cualquier otra persona que intente hacer esto con un DateTimePicker: aquí está la solución http://stackoverflow.com/questions/1595481/datetimepicker-and-userpaint-text-and-button-missing – Breeze

Cuestiones relacionadas