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

时间:2008-12-16 21:01:05

标签: c# .net graphics colors brush

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

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

除了刷子/画笔中的值不是枚举。所以Enum.Parse没有给我带来快乐。建议?

10 个答案:

答案 0 :(得分:69)

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

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

答案 1 :(得分:41)

要刷的字符串:

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

这就是我的情况!

答案 2 :(得分:11)

画笔可以像这样声明

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

答案 3 :(得分:8)

D'哦。看了一会儿后,我找到了:

 Color.FromName(a.Value)

点击“帖子”后。从那里开始,这是一个很短的步骤:

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

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

答案 4 :(得分:2)

您可以使用反射:

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

尝试使用TypeConverter。例如:

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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

答案 9 :(得分:-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

因为Color中的System.Windows.Media类没有FromName()成员,所以它甚至都不适用。

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

许多像我这样的人甚至可能甚至不需要转换并使用问题本身所指出的枚举。

Brush color = Brushes.Red;