Reputation: 13189
I have a configuration file where a developer can specify a text color by passing in a string:
<text value="Hello, World" color="Red"/>
Rather than have a gigantic switch statement look for all of the possible colors, it'd be nice to just use the properties in the class System.Drawing.Brushes instead so internally I can say something like:
Brush color = Brushes.Black; // Default
// later on...
this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));
Except that the values in Brush/Brushes aren't enums. So Enum.Parse gives me no joy. Suggestions?
Upvotes: 44
Views: 98947
Reputation: 12247
I was getting namespace conflicts when trying solutions to this question. Turns out Brush
and Color
classes exists in two difference namespaces System.Windows.Media
and System.Drawing
and they have similar function names but there are differences too.
If you working with controls like below, it uses Media namespace so make sure you have the correct namespace added wherever you use this objects.
<Button Content="Change Color" Background="AliceBlue"/>
This part in the accepted answer is really right(best) answer but it's good to know about the namespaces.
Brush color = (SolidColorBrush)new BrushConverter().ConvertFromString("Green");
Do note that the following (as suggested in accepted answer) doesn't compile in this namespace.
Color red1 = Color.FromName("Red"); // don't even try, its wrong namespace
Because the Color
class in System.Windows.Media
doesn't have FromName()
member so it's not even applicable.
So so many solutions above but nobody has mentioned namespaces and the answer really depends on that. This question is actually about the Media namespace because that has color names but not mentioning that can confuse new readers who is trying these solutions.
Many people like myself may even not even need the conversion and use the enum as noted in the question itself.
Brush color = Brushes.Red;
Upvotes: -1
Reputation:
A brush can be declared like this
Brush myBrush = new SolidBrush(Color.FromName("Red"));
Upvotes: 16
Reputation: 37
You can use System.Drawing.KnownColor enum. It specifies all known system colors.
Upvotes: -2
Reputation: 17434
Recap of all previous answers, different ways to convert a string to a Color or Brush:
// 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");
Upvotes: 84
Reputation: 16411
String to brush:
myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;
That's my case here!
Upvotes: 50
Reputation: 6318
I agree that using TypeConverters are the best method:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
return new Brush(c);
Upvotes: 1
Reputation: 103760
If you want, you can extend this even more and allow them to specify values for the R, G and B values. Then you just call Color.FromArgb(int r, int g, int b);
Upvotes: 0
Reputation:
You could use reflection for this:
Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);
Of course, you'll want some error handling/range checking if the string is wrong.
Upvotes: 3
Reputation: 13189
D'oh. After a while of looking I found:
Color.FromName(a.Value)
After hitting "post". From there it's a short step to:
color = new SolidBrush(Color.FromName(a.Value));
I'll leave this question here for others....
Upvotes: 8
Reputation: 117300
Try using a TypeConverter
. Example:
var tc = TypeDescriptor.GetConverter(typeof(Brush));
Another alternative is to use reflection, and go over the properties in SystemBrushes
.
Upvotes: -1