c# - microsoft - xna para terraria
Convertir cadena a color en C# (9)
(Realmente hubiera sido bueno si hubieras mencionado en qué tipo de Color
te interesaba comenzar con ...)
Una forma simple de hacer esto es simplemente construir un diccionario a través de la reflexión:
public static class Colors
{
private static readonly Dictionary<string, Color> dictionary =
typeof(Color).GetProperties(BindingFlags.Public |
BindingFlags.Static)
.Where(prop => prop.PropertyType == typeof(Color))
.ToDictionary(prop => prop.Name,
prop => (Color) prop.GetValue(null, null)));
public static Color FromName(string name)
{
// Adjust behaviour for lookup failure etc
return dictionary[name];
}
}
Eso será relativamente lento para la primera búsqueda (mientras usa la reflexión para encontrar todas las propiedades), pero debería ser muy rápido después de eso.
Si desea que no StringComparer.OrdinalIgnoreCase
mayúsculas de minúsculas, puede pasar algo como StringComparer.OrdinalIgnoreCase
como un argumento adicional en la llamada ToDictionary
. Puede agregar fácilmente métodos TryParse
etc. si lo desea.
Por supuesto, si solo necesita esto en un lugar, no se moleste con una clase separada, etc.
Estoy encontrando un problema que es cómo convierto cadenas de entrada como "ROJO" al tipo de color real Color.Red
en C #. ¿Existe una forma correcta de hacer esto?
Podría pensar en usar una declaración de cambio y una declaración de casos para cada tipo de color, pero no creo que sea lo suficientemente inteligente.
Dado que el OP menciona en un comentario que está usando Microsoft.Xna.Framework.Graphics.Color
lugar de System.Drawing.Color
, primero puede crear un System.Drawing.Color y luego convertirlo en un Microsoft.Xna.Framework.Graphics.Color
public static Color FromName(string colorName)
{
System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName);
return new Color(systemColor.R, systemColor.G, systemColor.B, systemColor.A); //Here Color is Microsoft.Xna.Framework.Graphics.Color
}
Depende de lo que estés buscando, si necesitas System.Windows.Media.Color (como en WPF) es muy fácil:
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
Esto funcionó muy bien para mis necesidades;) Espero que alguien pueda usarlo ...
public static Color FromName(String name)
{
var color_props= typeof(Colors).GetProperties();
foreach (var c in color_props)
if (name.Equals(c.Name, StringComparison.OrdinalIgnoreCase))
return (Color)c.GetValue(new Color(), null);
return Colors.Transparent;
}
He usado algo como esto antes:
public static T CreateFromString<T>(string stringToCreateFrom) {
T output = Activator.CreateInstance<T>();
if (!output.GetType().IsEnum)
throw new IllegalTypeException();
try {
output = (T) Enum.Parse(typeof (T), stringToCreateFrom, true);
}
catch (Exception ex) {
string error = "Cannot parse ''" + stringToCreateFrom + "'' to enum ''" + typeof (T).FullName + "''";
_logger.Error(error, ex);
throw new IllegalArgumentException(error, ex);
}
return output;
}
La forma más sencilla:
string input = null;
Color color = Color.White;
TextBoxText_Changed(object sender, EventsArgs e)
{
input = TextBox.Text;
}
Button_Click(object sender, EventsArgs e)
{
color = Color.FromName(input)
}
Para la transferencia de colores a través de cadenas xml he descubierto:
Color x = Color.Red; // for example
String s = x.ToArgb().ToString()
... to/from xml ...
Int32 argb = Convert.ToInt32(s);
Color red = Color.FromArgb(argb);
Color red = Color.FromName("Red");
MSDN no dice de una manera u otra, por lo que es muy probable que distinga entre mayúsculas y minúsculas. (ACTUALIZACIÓN: Al parecer, no lo es.)
Por lo que puedo decir, ColorTranslator.FromHtml
es también.
Si Color.FromName
no puede encontrar una coincidencia, devuelve un new Color(0,0,0);
Si ColorTranslator.FromHtml
no puede encontrar una coincidencia, lanza una excepción.
ACTUALIZAR:
Ya que estás usando Microsoft.Xna.Framework.Graphics.Color, esto se vuelve un poco complicado:
using XColor = Microsoft.Xna.Framework.Graphics.Color;
using CColor = System.Drawing.Color;
CColor clrColor = CColor.FromName("Red");
XColor xColor = new XColor(clrColor.R, clrColor.G, clrColor.B, clrColor.A);
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");
(Use mi método si desea aceptar colores hexadecimales de estilo HTML).