web-dev-qa-db-fra.com

Convertir une chaîne en couleur en C #

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.

58
Kevin
 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);
91
James Curran
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");

(Utilisez ma méthode si vous souhaitez accepter les couleurs hexadécimales de style HTML.)

17
Larsenal

(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. :)

15
Jon Skeet

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
}
7
Davy8

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
6
pr0gg3r

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);
4
user2457260

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;
    }
3
MIke Zirkle

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)
}
2
Gustaf Linder