40

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

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

4

10 回答 10

77

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

// 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");
于 2009-05-22T20:24:44.597 回答
49

要刷的字符串:

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

这就是我的情况!

于 2009-05-22T19:55:04.733 回答
16

可以像这样声明一个画笔

Brush myBrush = new SolidBrush(Color.FromName("Red"));
于 2009-10-09T05:08:03.800 回答
8

哦。看了一会儿,我发现:

 Color.FromName(a.Value)

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

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

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

于 2008-12-16T21:04:35.343 回答
3

您可以为此使用反射:

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

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

于 2008-12-16T21:07:56.867 回答
1

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

 Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
 return new Brush(c);
于 2008-12-17T20:55:25.783 回答
0

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

于 2008-12-16T21:10:30.933 回答
-1

尝试使用TypeConverter. 例子:

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

另一种选择是使用反射,并检查SystemBrushes.

于 2008-12-16T21:03:51.883 回答
-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;
于 2020-06-30T03:13:12.980 回答
-2

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

于 2016-11-22T15:07:36.930 回答