Подтвердить что ты не робот

Преобразование строки в цвет в С#

Я столкнулся с проблемой, которая заключается в том, как преобразовать входные строки типа "RED" в фактический тип цвета Color.Red в С#. Есть ли хороший способ сделать это?

Я мог бы подумать об использовании оператора switch и case для каждого типа цвета, но я не думаю, что это достаточно умно.

4b9b3361

Ответ 1

 Color red = Color.FromName("Red");   

MSDN не говорит так или иначе, поэтому есть хороший шанс, что он чувствителен к регистру. (ОБНОВЛЕНИЕ: По-видимому, это не так.)

Насколько я могу судить, ColorTranslator.FromHtml также.

Если Color.FromName не может найти совпадение, он возвращает new Color(0,0,0);

Если ColorTranslator.FromHtml не может найти совпадение, оно выдает исключение.

UPDATE:

Поскольку вы используете Microsoft.Xna.Framework.Graphics.Color, это немного сложно:

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

Ответ 2

System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");

(Используйте мой метод, если вы хотите принять шестигранные цвета в стиле HTML).

Ответ 3

(Было бы неплохо, если бы вы упоминали, какой тип Color вас интересует, чтобы начать с...)

Один простой способ сделать это - просто создать словарь через отражение:

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];
    }
}

Это будет относительно медленным для первого поиска (в то время как он использует отражение для поиска всех свойств), но должен быть очень быстрым после этого.

Если вы хотите, чтобы он был нечувствителен к регистру, вы можете передать что-то вроде StringComparer.OrdinalIgnoreCase в качестве дополнительного аргумента в вызове ToDictionary. Вы можете легко добавить TryParse и т.д., Если хотите.

Конечно, если вам это нужно только в одном месте, не беспокойтесь о отдельном классе и т.д.:)

Ответ 4

Поскольку OP упоминает в комментарии, что он использует Microsoft.Xna.Framework.Graphics.Color, а не System.Drawing.Color, вы можете сначала создать System.Drawing.Color, а затем преобразовать его в 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
}

Ответ 5

Это зависит от того, что вы ищете, если вам нужна System.Windows.Media.Color(например, в WPF), это очень просто:

System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84

Ответ 6

Это хорошо работало для моих нужд;) Надеюсь, кто-то сможет его использовать.

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

Ответ 7

Для передачи цветов через xml-строки я обнаружил:

Color x = Color.Red; // for example
String s = x.ToArgb().ToString()
... to/from xml ...
Int32 argb = Convert.ToInt32(s);
Color red = Color.FromArgb(argb);

Ответ 8

Самый простой способ:

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

Ответ 9

Я использовал что-то вроде этого раньше:

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