2009-03-23 25 views
33

sé que puedo ir a la ruta de largo por ...¿Cómo convierto una cadena como "Rojo" en una System.Windows.Media.Color?

  1. añadir una referencia a System.Drawing
  2. Creación de una System.Drawing.Color de la cadena
  3. Creación de la System.Windows.Media . Color de los valores ARGB del System.Drawing.Color.

Pero esto se siente como una exageración seria.

¿Hay alguna manera más fácil?

+0

yo sepa, en C# se puede hacer esto utilizando Enum.Parse (typeof (MyEnumType), "Rojo") tal vez eso puede ayudar con una dirección? – scraimer

Respuesta

83
var color = (Color)ColorConverter.ConvertFromString("Red"); 
+0

Eso es exactamente lo que estaba buscando! Claro y simple, gracias! – willem

+0

Perfecto, funciona genial. –

12

nuevo y mejor respuesta

Por supuesto, ColorConverter es el camino a seguir. Llame al ColorConverter.ConvertFromString y emita el resultado. Es cierto que esto implicará el boxeo. Si desea evitar el boxeo, cree un diccionario para comenzar con los nombres estándar (aún usando ColorConverter) y luego use el diccionario para búsquedas posteriores.

Respuesta original

Se podía bastante ir a buscar fácilmente los nombres y valores de las propiedades de System.Windows.Media.Colors una sola vez en un mapa:

private static readonly Dictionary<string, Color> KnownColors = FetchColors(); 

public static Color FromName(string name) 
{ 
    return KnownColors[name]; 
} 

private static Dictionary<string, Color> FetchColors() 
{ 
    // This could be simplified with LINQ. 
    Dictionary<string, Color> ret = new Dictionary<string, Color>(); 
    foreach (PropertyInfo property in typeof(Colors).GetProperties()) 
    { 
     ret[property.Name] = (Color) property.GetValue(null); 
    } 
    return ret; 
} 

Es un poco feo, pero es un golpe de una sola vez.

+0

Buen consejo, gracias! – willem

+0

Para cualquiera que busque esa versión simplificada de linq: 'typeof (Colors) .GetProperties(). ToDictionary (pi => pi.Name, co => (Color) co.GetValue (null));' :-) –

1

Este código hace que el nombre se traduce en Color clase más rápido:

public class FastNameToColor 
{ 
    Dictionary<string, Color> Data = new Dictionary<string, Color>(); 

    public FastNameToColor() 
    { 
     System.Reflection.PropertyInfo[] lColors = typeof(System.Drawing.Color).GetProperties(); 

     foreach (PropertyInfo pi in lColors) 
     { 
      object val = pi.GetValue(null, null); 
      if (val is Color) 
      { 
       Data.Add(pi.Name, (Color)val); 
      } 
     } 
    } 

    public Color GetColor(string Name) 
    { 
     return Data[Name]; 
    } 
} 

pueden ampliar este código de traducir el nombre a Media.Color directamente.

Cuestiones relacionadas