Преобразовать строку в имя цвета кисти / кисти в C # - PullRequest
35 голосов
/ 17 декабря 2008

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

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

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

 Brush color = Brushes.Black;   // Default

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

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

Ответы [ 9 ]

69 голосов
/ 23 мая 2009

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

// 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");
41 голосов
/ 22 мая 2009

Строка для кисти:

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

Вот мой случай!

11 голосов
/ 09 октября 2009

Кисть может быть объявлена ​​вот так

Brush myBrush = new SolidBrush(Color.FromName("Red"));
8 голосов
/ 17 декабря 2008

D'о. Через некоторое время поиска я нашел:

 Color.FromName(a.Value)

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

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

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

2 голосов
/ 17 декабря 2008

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

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

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

1 голос
/ 17 декабря 2008

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

 Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
 return new Brush(c);
0 голосов
/ 22 ноября 2016

Вы можете использовать System.Drawing.KnownColor enum. Указывает все известные системные цвета.

0 голосов
/ 17 декабря 2008

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

0 голосов
/ 17 декабря 2008

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

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

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

...