Je rencontre un problème, comment convertir des chaînes d'entrée telles que "RED" en type de couleur Color.Red
en C #. Y at-il un bon moyen de le faire?
Je pourrais penser à utiliser une instruction switch et une instruction cases pour chaque type de couleur, mais je ne pense pas que cela soit assez intelligent.
Color red = Color.FromName("Red");
MSDN ne dit pas d'une manière ou d'une autre, il y a donc de bonnes chances qu'il soit sensible à la casse. (UPDATE: Apparemment, ce n'est pas le cas.)
Autant que je sache, ColorTranslator.FromHtml
L'est aussi.
Si Color.FromName
Ne peut pas trouver de correspondance, il retourne new Color(0,0,0);
Si ColorTranslator.FromHtml
Ne peut pas trouver de correspondance, il lève une exception.
MISE À JOUR:
Puisque vous utilisez Microsoft.Xna.Framework.Graphics.Color, ceci devient un peu compliqué:
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");
(Utilisez ma méthode si vous souhaitez accepter les couleurs hexadécimales de style HTML.)
(Cela aurait vraiment été bien si vous aviez mentionné le type de Color
qui vous intéressait pour commencer ...)
Une façon simple de le faire est de créer un dictionnaire par réflexion:
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];
}
}
Ce sera relativement lent pour la première recherche (alors qu'il utilise la réflexion pour trouver toutes les propriétés) mais devrait être très rapide par la suite.
Si vous voulez qu'il soit insensible à la casse, vous pouvez passer quelque chose comme StringComparer.OrdinalIgnoreCase
comme argument supplémentaire dans l'appel ToDictionary
. Vous pouvez facilement ajouter des méthodes TryParse
etc si vous le souhaitez.
Bien sûr, si vous n'en avez besoin que dans un endroit, ne vous embêtez pas avec un cours séparé, etc. :)
Puisque l'OP a mentionné dans un commentaire qu'il utilise Microsoft.Xna.Framework.Graphics.Color
Plutôt que System.Drawing.Color
, Vous pouvez d'abord créer un System.Drawing.Color, puis le convertir en 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
}
Cela dépend de ce que vous recherchez, si vous avez besoin de System.Windows.Media.Color (comme dans WPF), c'est très simple:
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
Pour transférer des couleurs via des chaînes xml, j'ai découvert:
Color x = Color.Red; // for example
String s = x.ToArgb().ToString()
... to/from xml ...
Int32 argb = Convert.ToInt32(s);
Color red = Color.FromArgb(argb);
Cela a bien fonctionné pour mes besoins;) J'espère que quelqu'un pourra l'utiliser ....
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;
}
Le moyen le plus simple:
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)
}