在C#中将字符串转换为画刷/画刷颜色名称

44

我有一个配置文件,开发人员可以通过传递字符串来指定文本颜色:

 <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对我无济于事。有什么建议吗?


请注意,颜色和画刷不是同一回事,您似乎把它们混淆了。 - Lucas
10个回答

82

回顾之前所有的答案,有不同的方法将字符串转换为颜色或画刷:

// 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");

3
请问您能否补充一下如何在WPF的XAML中实现这个功能呢? - Chuck Savage
我在VS Express 2012中的标准WPF应用程序代码后台遇到了这个错误:Error 1 'System.Windows.Media.Color' does not contain a definition for 'FromName' - Matt
1
@Matt FromColor() 是 Windows.Drawing.Color 的成员,它不是 WPF 类。 - escape-llc

50

字符串转换为画刷:

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

这就是我的情况!


System.Drawing.ColorTranslator具有FromHtml()和ToHtml()方法。 - Lucas
2
请注意,这需要 .Net 3.0 或更高版本。 - Lucas

16

可以这样声明一个画笔

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

1
另一种选择是:Brush aBrush = new SolidBrush(Color.FromArgb(240, 240, 240)); - John M

8
哦。经过一段时间的寻找,我找到了:
 Color.FromName(a.Value)

“点击发布”后,接下来只需简单几步即可:
 color = new SolidBrush(Color.FromName(a.Value));

我会把这个问题留在这里,供其他人回答。

严格来说,Brushes 上的静态属性与 Color 上的静态属性使用了相同的名称只是一个“巧合”。然而,这可能并不值得担心。 - Jon B

3
您可以使用反射来实现这个功能:
Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);

当然,如果字符串错误,您需要一些错误处理/范围检查。


与其他答案不同,这个答案不会创建新的画笔实例,这是很好的,参见https://stackoverflow.com/questions/40904567/how-do-i-prevent-memory-leak-from-solidcolorbrush-object。 - Sasha Yakobchuk

1

我同意使用类型转换器是最好的方法:

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

0
如果你想的话,你甚至可以进一步扩展它,允许他们指定R、G和B值。然后你只需要调用Color.FromArgb(int r, int g, int b)函数即可。

-1

尝试使用 TypeConverter。示例:

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

另一种选择是使用反射,并遍历 SystemBrushes 中的属性。

TypeDescriptor 无法将字符串转换为 Brush。但它可以将字符串转换为 Color。 - Lucas

-1
当我尝试解决这个问题时,我遇到了命名空间冲突。原来BrushColor类存在于两个不同的命名空间System.Windows.MediaSystem.Drawing中,并且它们具有相似的函数名称,但也存在差异。
如果您正在使用像下面这样的控件,则使用Media命名空间,请确保在使用此对象的任何地方都添加了正确的命名空间。
<Button Content="Change Color" Background="AliceBlue"/>

接受答案中的这部分内容是真正正确(最佳)的答案,但了解命名空间也是很好的。

Brush color = (SolidColorBrush)new BrushConverter().ConvertFromString("Green");

请注意,以下内容(如接受的答案所建议)在此命名空间中无法编译。
Color red1 = Color.FromName("Red"); // don't even try, its wrong namespace

由于System.Windows.Media中的Color类没有FromName()成员,因此它甚至不适用。

上面有很多解决方案,但没有人提到命名空间,答案实际上取决于命名空间。这个问题实际上是关于Media命名空间的,因为它具有颜色名称,但不提及可能会让尝试这些解决方案的新读者感到困惑。

像我这样的许多人甚至不需要转换,而是像问题本身所述使用枚举。

Brush color = Brushes.Red;

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接