2009-10-01 14 views
5

Estoy construyendo una aplicación WinForms, y estoy usando colores específicos en la mayoría de los controles. Lo hago a veces desde el diseñador de WinForms, y algunas veces directamente en mi código.¿Cómo debo implementar un código de color para toda la aplicación en una aplicación WinForm?

que tiene una clase estática en algún lugar con ese aspecto:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

    } 

puedo usar esos colores en mi código con bastante facilidad, pero es imposible hacer del diseñador, lo que plantea este error:

MyColors.DarkGreen no es un valor válido para Int32.

(He tratado de almacenar la representación Int32 de esos colores, pero esto no funciona con el mismo error)

La solución que estoy usando en este momento es usar el código de color RGB en el diseñador , los valores de clase MyColors en mi código, y estoy haciendo cambios usando la funcionalidad de reemplazar todos los de Visual Studio. Esta no es una buena solución, pero hasta ahora no he podido encontrar una mejor idea.

¿Alguna idea?


Nota: Yo sé de this question, que es ligeramente diferente de la mía, ya que no estoy mirando el cambio de las "KnownColors".

Respuesta

2

Para obtener soporte de diseñador para sus definiciones de color adicionales, probablemente necesite crear sus propios editores que amplíen o reemplacen el editor Color. Una vez que los haya definido, deberá decirle al diseñador qué propiedades deben usar su editor aplicando el atributo Editor a las propiedades afectadas.

También puede lograr algo de éxito haciendo algo similar con TypeConverter y TypeConverterAttribute.

+0

@Jeff: dado que quiero actualizar los colores de los controles de formas de vida (botón, etiqueta, etc.), no puedo aplicar el atributo Editor a sus propiedades ForeColor/BackColor, a menos que herede de todos esos controles, que suena un poco exagerado para mí ... ¿o extrañé algo? – Brann

+0

@Brann: Ya hereda al implementar su formulario. Tendría que aplicarlo a anulaciones dentro de su propia forma. –

+0

Por supuesto, los controles dentro del formulario tendrían que configurarse en Color.Empty para heredar de su control principal, o también tendría que anularlos. No creo que haya una alternativa para obtener soporte de diseñador, me temo. –

2

No creo que esto sea posible, porque tendría que cambiar el comportamiento de la ventana Propiedades en sí. Escribir en "255, 128, 64" funciona porque la ventana Propiedades contiene un código que intenta convertir lo que está escrito en un color del sistema, un color denominado "web", o bien un color especificado por RGB, y muestra el "blah blah blah" no es un valor válido para Int32 ". mensaje para cualquier texto que no pueda convertir de esta manera (como "MyColors.DarkGreen").

+1

Puede anular este comportamiento proporcionando su propio TypeConverter, pero debe sobrescribir los controles para agregarlo a las propiedades para que funcione. –

+0

@Jeff: te creo, y como es típico de StackOverflow, recibo votos por decir "no puedes hacer esto" mientras no obtienes votos (hasta el mío) por sugerir cómo puedes hacer esto. :) – MusiGenesis

1

Su mejor opción es probablemente no intentar hacer nada en el diseñador. Simplemente deje todos sus formularios con los colores predeterminados en el momento del diseño.

He estado en proyectos que tenían un esquema similar al tuyo y todo tipo de problemas surgieron. Un botón se ajustó a un valor RGB en el diseñador; Otro botón en la misma forma tiene su color configurado en el código (de la clase estática) y los dos colores son ligeramente diferentes. Con el tiempo estos problemas se arrastrarán en.

Si alguna vez desea cambiar un color, usted tiene que cambiar la clase estática y comprobar todas de sus formas. Las diferencias sutiles no serán obvias.

Si configura todos los colores en el código, si pierde un control, será inmediatamente obvio. Si decide cambiar un color, solo necesita cambiarlo en un solo lugar.

Otro cambio que hicimos fue agregar miembros a la clase estática que tenía un uso mencionado en su nombre.

Por ejemplo:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

     public static Color ButtonBackColor = DarkGreen; 
    } 

esta manera, si desea cambiar todos los botones de verde oscuro a naranja, que es sólo un cambio de una sola línea.

0

Esto debería darle el resultado que está buscando. Probablemente exista una cantidad excesiva de corchetes que puede eliminar.

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62))))); 
1

Si usted está tratando de tener un enfoque temático, es decir, las etiquetas con propiedades BackColor y ForeColor fijos crean un componente y cambiar su código detrás, como a continuación:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace YourNameSpace 
{ 
    public partial class NameOfStaticColoredLabel : Label 
    { 
     public NameOfStaticColoredLabel() 
     { 
      InitializeComponent(); 
     } 

     public NameOfStaticColoredLabel(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     public override Color ForeColor 
     { 
      get 
      { 
       return Color.Black; 
      } 
      set 
      { 
       base.ForeColor = Color.Black; 
      } 
     } 

     public override Color BackColor 
     { 
      get 
      { 
       return Color.Aquamarine; 
      } 
      set 
      { 
       base.BackColor = Color.Aquamarine; 
      } 
     } 
    } 
} 

Como se puede ver todo lo que tiene do está anulando las propiedades relacionadas del control de etiqueta. A continuación, arrastre y suelte estas etiquetas en sus formularios de solicitud. Cuando necesite cambiar su color, hágalo en la clase superior y reconstruya la aplicación. Este enfoque creará una etiqueta de color estática y no puede cambiar su color de diseñador o código.

Cuestiones relacionadas