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

у меня есть файл конфигурации, где разработчик может указать цвет текста, передав строку:

 <text value="Hello, World" color="Red"/>

вместо того, чтобы гигантский оператор switch искал все возможные цвета, было бы неплохо просто использовать свойства в системе классов.Рисунок.Кисти вместо этого так внутренне я могу сказать что-то вроде:

 Brush color = Brushes.Black;   // Default

 // later on...
 this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));

за исключением того, что значения в Brush / Brush не являются перечислениями. Итак, Перечисление.Парс не доставляет мне радости. Предложения?

9 ответов


перепросмотр всех предыдущих ответов, различные способы преобразования строки в цвет или кисть:

// best, using Color's static method
Color red1 = Color.FromName("Red");

// using a ColorConverter
TypeConverter tc1 = TypeDescriptor.GetConverter(typeof(Color)); // ..or..
TypeConverter tc2 = new ColorConverter();
Color red2 = (Color)tc.ConvertFromString("Red");

// using Reflection on Color or Brush
Color red3 = (Color)typeof(Color).GetProperty("Red").GetValue(null, null);

// in WPF you can use a BrushConverter
SolidColorBrush redBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("Red");

строка до кисти:

myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;

Это мое дело здесь!


кисть может быть объявлена следующим образом

Brush myBrush = new SolidBrush(Color.FromName("Red"));

отмена. Через некоторое время я нашел:

 Color.FromName(a.Value)

после нажатия "post". Оттуда это короткий шаг, чтобы:

 color = new SolidBrush(Color.FromName(a.Value));

Я оставлю этот вопрос здесь для других....


вы можете использовать отражение для этого:

Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);

конечно, вам понадобится некоторая обработка ошибок / проверка диапазона, если строка неверна.


Я согласен, что использование TypeConverters-лучший метод:

 Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
 return new Brush(c);

попробуйте использовать TypeConverter. Пример:

var tc = TypeDescriptor.GetConverter(typeof(Brush));

Другой альтернативой является использование отражения и переход к свойствам в SystemBrushes.


Если вы хотите, вы можете расширить это еще больше и позволить им указать значения для значений R, G и B. Тогда вы просто называете цвет.FromArgb(int r, int g, int b);


можно использовать