Как мне преобразовать строку типа «Red» в System.Windows.Media.Color? - PullRequest
37 голосов
/ 23 марта 2009

Я знаю, что могу пройти длинный путь ...

  1. Добавление ссылки на System.Drawing
  2. Создание System.Drawing.Color из строки
  3. Создание System.Windows.Media.Color из значений ARGB System.Drawing.Color.

Но это похоже на серьезное излишество.

Есть ли более простой способ?

Ответы [ 5 ]

92 голосов
/ 23 марта 2009
var color = (Color)ColorConverter.ConvertFromString("Red");
14 голосов
/ 23 марта 2009

Новый и лучший ответ

Конечно, ColorConverter - это путь. Вызовите ColorConverter.ConvertFromString и приведите результат. Правда это будет связано с боксом. Если вы хотите избежать бокса, создайте словарь для начала для стандартных имен (все еще используя ColorConverter), а затем используйте словарь для последующих поисков.

Оригинальный ответ

Вы можете довольно легко получить имена и значения свойств из System.Windows.Media.Colors один раз на карту:

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

Это немного некрасиво, но это одноразовый хит.

11 голосов
/ 23 марта 2009

System.Windows.Media.ColorConverter , как это делает XamlReader.

var result = ColorConverter.ConvertFromString("Red") as Color;
1 голос
/ 18 января 2015

Кстати, еще один более простой способ - использовать статический класс, созданный Microsoft, например Colors.Red

http://msdn.microsoft.com/en-us/library/windows/desktop/bb189018.aspx

1 голос
/ 23 марта 2009

Этот код ускоряет перевод имени в Color класс:

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

Вы можете расширить этот код, чтобы перевести имя на Media.Color напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...