English 中文(简体)
将字符串转换为C#中的画笔/画笔颜色名称
原标题:
  • 时间:2008-12-16 21:01:04
  •  标签:

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

 <text value="Hello, World" color="Red"/>

与其使一个巨大的开关语句寻找所有可能的颜色,不如只使用类System.Drawing.Brushes中的属性,这样在内部就可以说出这样的话:

 Brush color = Brushes.Black;   // Default

 // later on...
 this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));

除了 Brush/Brushes 中的值不是枚举值,所以 Enum.Parse 不能解决我的问题。有什么建议吗?

最佳回答

对以前所有答案进行总结,将字符串转换为颜色或画刷的不同方式:

// 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");
问题回答

笔刷

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

这是我的情况!

一把刷子可以这样声明。

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

哦。过了一会儿,我找到了:

 Color.FromName(a.Value)

点击“发布”后。从那里进一步: (Note: The translation may vary depending on the context. This translation assumes the context of social media or online forums.)

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

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

您可以使用反射来实现此功能:

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

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

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

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

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

尝试使用 TypeConverter。示例:

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

另一个选择是使用反射,在 SystemBrushes 中遍历属性。

当尝试解决这个问题时,我遇到了命名空间冲突。结果发现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()成员,所以它甚至都不适用。

以上有很多解决方案,但没有人提到名称空间,答案确实取决于此。这个问题实际上是关于「媒体」名称空间的,因为它拥有颜色名称,但没有提到这点可能会令尝试这些解决方案的新读者困惑。

许多人,包括我自己,甚至可能不需要将其转换,而是直接使用问题本身中提到的枚举类型。

Brush color = Brushes.Red;

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





相关问题
热门标签