Clinton Pierce
Clinton Pierce

Reputation: 13189

Convert string to Brushes/Brush color name in C#

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

Answers (10)

zar
zar

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

user186917
user186917

Reputation:

A brush can be declared like this

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

Upvotes: 16

Const Mi
Const Mi

Reputation: 37

You can use System.Drawing.KnownColor enum. It specifies all known system colors.

Upvotes: -2

Lucas
Lucas

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

Junior Mayhe
Junior Mayhe

Reputation: 16411

String to brush:

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

That's my case here!

Upvotes: 50

Brian Rudolph
Brian Rudolph

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

BFree
BFree

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

user27414
user27414

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

Clinton Pierce
Clinton Pierce

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

leppie
leppie

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

Related Questions