2011-02-23 17 views
7

Hola everbody,Web Lista de colores en C# aplicación

si por ejemplo me puse el BackColor de un Grupo Especial de Winform utilizando Visual Studio, puedo recoger el color de 3 listas:

personalizado, Web, Sistema

¿Es posible recuperar solo los colores web en mi aplicación de código C#? Son parte de KnownColor, pero hasta ahora solo podía encontrar la manera de eliminar System Control de mi lista.

Me gustaría utilizar los colores de la web porque están ordenados de una manera agradable y me gustaría insertarlos en un cuadro combinado auto-implementado.

Gracias

+0

¿Desea una lista de KnownColor enum? – Magnus

+0

Básicamente sí, pero me gustaría que los colores se clasifiquen como en la pestaña Web en Visual Studio. He intentado ordenar los colores con algunos algoritmos pero el resultado no es tan bueno. – Klaus78

Respuesta

8

Color estructura contiene todos los colores web como constantes (los colores del sistema se definen como constantes en SystemColors clase)

Para obtener una lista de estos colores acaba de hacer:

var webColors = GetConstants(typeof(Color)); 
var sysColors = GetConstants(typeof(SystemColors)); 

teniendo GetConstants definido de la siguiente manera:

static List<Color> GetConstants(Type enumType) 
{ 
    MethodAttributes attributes = MethodAttributes.Static | MethodAttributes.Public; 
    PropertyInfo[] properties = enumType.GetProperties(); 
    List<Color> list = new List<Color>(); 
    for (int i = 0; i < properties.Length; i++) 
    { 
     PropertyInfo info = properties[i]; 
     if (info.PropertyType == typeof(Color)) 
     { 
      MethodInfo getMethod = info.GetGetMethod(); 
      if ((getMethod != null) && ((getMethod.Attributes & attributes) == attributes)) 
      { 
       object[] index = null; 
       list.Add((Color)info.GetValue(null, index)); 
      } 
     } 
    } 
    return list; 
} 

EDIT:

Para obtener colores ordenados exactamente como en VS hacer:

var webColors = GetConstants(typeof(Color)); 
var sysColors = GetConstants(typeof(SystemColors)); 

webColors.Sort(new StandardColorComparer()); 
sysColors.Sort(new SystemColorComparer()); 

con StandardColorComparer y SystemColorComparer definen como sigue:

class StandardColorComparer : IComparer<Color> 
{ 
    // Methods 
    public int Compare(Color color, Color color2) 
    { 
     if (color.A < color2.A) 
     { 
      return -1; 
     } 
     if (color.A > color2.A) 
     { 
      return 1; 
     } 
     if (color.GetHue() < color2.GetHue()) 
     { 
      return -1; 
     } 
     if (color.GetHue() > color2.GetHue()) 
     { 
      return 1; 
     } 
     if (color.GetSaturation() < color2.GetSaturation()) 
     { 
      return -1; 
     } 
     if (color.GetSaturation() > color2.GetSaturation()) 
     { 
      return 1; 
     } 
     if (color.GetBrightness() < color2.GetBrightness()) 
     { 
      return -1; 
     } 
     if (color.GetBrightness() > color2.GetBrightness()) 
     { 
      return 1; 
     } 
     return 0; 
    } 
} 

class SystemColorComparer : IComparer<Color> 
{ 
    // Methods 
    public int Compare(Color color, Color color2) 
    { 
     return string.Compare(color.Name, color2.Name, false, CultureInfo.InvariantCulture); 
    } 
} 

N. B. :

Este código ha sido tomado de System.Drawing.Design.ColorEditor a través del reflector.

+0

Nodo: 'GetConstants' es (básicamente) el mismo usado en el selector de color utilizado para' BackgroundColor', etc. propiedades – digEmAll

+0

Gracias por las respuestas. El hecho es que ambas soluciones devuelven los colores ordenados según el nombre de la cadena. Me gustaría que los colores se clasifiquen como en la pestaña Visual Studio, donde los colores rojos se agrupan ecc .... – Klaus78

+0

@ Klaus78: verifique mi edición;) – digEmAll

7
var webColors = 
    Enum.GetValues(typeof(KnownColor)) 
    .Cast<KnownColor>() 
    .Where (k => k >= KnownColor.Transparent && k < KnownColor.ButtonFace) //Exclude system colors 
    .Select(k => Color.FromKnownColor(k)); 

EDIT:

Para pedir los colores anexan:

.OrderBy(c => c.GetHue()) 
.ThenBy(c => c.GetSaturation()) 
.ThenBy(c => c.GetBrightness()); 
+0

Mucho más conciso que la otra respuesta . –

0

Si usted lo necesita ordenadas según su color primario podría utilizar esto como punto de partida:

var colors = Enum.GetValues(typeof(KnownColor)) 
       .Cast<KnownColor>() 
       .Select(kc => Color.FromKnownColor(kc)) 
       .OrderBy(c => c.GetHue())