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

Posted

技术标签:

【中文标题】在 C# 中将字符串转换为画笔/画笔颜色名称【英文标题】:Convert string to Brushes/Brush color name in C# 【发布时间】:2010-09-27 05:25:42 【问题描述】:

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

 <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 没有给我带来快乐。有什么建议吗?

【问题讨论】:

请注意,颜色和画笔不是一回事,您似乎将它们混合在一起 【参考方案1】:

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

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

【讨论】:

介意添加如何使用 WPF 的 XAML 执行此操作吗? 我收到此错误:Error 1 'System.Windows.Media.Color' does not contain a definition for 'FromName' VS Express 2012,我在标准 WPF 应用程序代码隐藏中。 @Matt FromColor() 是 Windows.Drawing.Color 的成员,它不是 WPF 类。【参考方案2】:

要刷的字符串:

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

这就是我的情况!

【讨论】:

System.Drawing.ColorTranslator 有 Fromhtml() 和 ToHtml() 另请注意,这需要 .Net 3.0 或更高版本【参考方案3】:

画笔可以这样声明

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

【讨论】:

+1 另一种选择是:画笔 aBrush = new SolidBrush(Color.FromArgb(240, 240, 240));【参考方案4】:

哦。看了一会发现:

 Color.FromName(a.Value)

点击“发布”后。从那里只需一小步即可:

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

我会把这个问题留给其他人......

【讨论】:

严格来说,Brushes 上的静态属性与 Color 上的静态属性使用相同的名称是“巧合”。不过,这可能没什么好担心的。【参考方案5】:

您可以为此使用反射:

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

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

【讨论】:

与其他答案不同,这个不会创建新的画笔实例,这很好,见***.com/questions/40904567/…【参考方案6】:

我同意使用 TypeConverters 是最好的方法:

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

【讨论】:

【参考方案7】:

如果您愿意,您可以进一步扩展它并允许他们指定 R、G 和 B 值的值。然后你只需调用 Color.FromArgb(int r, int g, int b);

【讨论】:

【参考方案8】:

尝试使用TypeConverter。示例:

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

另一种方法是使用反射,并检查SystemBrushes 中的属性。

【讨论】:

TypeDescriptor 无法从字符串转换为画笔。它可以将字符串转换为颜色,不过...【参考方案9】:

在尝试解决此问题时,我遇到了命名空间冲突。原来BrushColor 类存在于两个不同的命名空间System.Windows.MediaSystem.Drawing 中,它们具有相似的函数名称,但也存在差异。

如果您使用如下所示的控件,它会使用媒体命名空间,因此请确保在使用此对象的任何位置都添加了正确的命名空间。

<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;

【讨论】:

【参考方案10】:

您可以使用System.Drawing.KnownColor 枚举。它指定所有已知的系统颜色。

【讨论】:

以上是关于在 C# 中将字符串转换为画笔/画笔颜色名称的主要内容,如果未能解决你的问题,请参考以下文章

Python中如何画一个画笔颜色为黄色的五角星,边长为200,画布背景颜色为黑色,画?

利用turtle库绘制半径为80的圆,要求画笔颜色为绿色,画笔宽度为3,填充黄色,代码?

创建和使用画笔

如何使用 c# 在 Xamarin.Ios 中将 UIColor 转换为字符串和字符串转换为 UIColor

如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?

[BZOJ 2120]数颜色