如何将像“Red”这样的字符串转换为System.Windows.Media.Color?

时间:2009-03-23 11:15:51

标签: wpf

我知道我可以走很长的路线......

  1. 添加对System.Drawing的引用
  2. 从字符串
  3. 创建System.Drawing.Color
  4. 从System.Drawing.Color的ARGB值创建System.Windows.Media.Color。
  5. 但这感觉就像严重的矫枉过正。

    有更简单的方法吗?

6 个答案:

答案 0 :(得分:91)

var color = (Color)ColorConverter.ConvertFromString("Red");

答案 1 :(得分:14)

新的更好的答案

当然,ColorConverter是要走的路。致电ColorConverter.ConvertFromString并投射结果。不可否认,这将涉及拳击。如果你想避免装箱,建立一个字典,最开始使用标准名称(仍然使用ColorConverter),然后使用字典进行后续查找。

原始回答

您可以非常轻松地将System.Windows.Media.Colors中的属性名称和值一次性地提取到地图中:

private static readonly Dictionary<string, Color> KnownColors = FetchColors();

public static Color FromName(string name)
{
    return KnownColors[name];
}

private static Dictionary<string, Color> FetchColors()
{
    // This could be simplified with LINQ.
    Dictionary<string, Color> ret = new Dictionary<string, Color>();
    foreach (PropertyInfo property in typeof(Colors).GetProperties())
    {
        ret[property.Name] = (Color) property.GetValue(null);
    }
    return ret;
}

这有点难看,但这是一次性打击。

答案 2 :(得分:11)

System.Windows.Media.ColorConverter是XamlReader的用法。

var result = ColorConverter.ConvertFromString("Red") as Color;

答案 3 :(得分:1)

此代码可以更快地将名称翻译为Color类:

public class FastNameToColor
{
    Dictionary<string, Color> Data = new Dictionary<string, Color>();

    public FastNameToColor()
    {
        System.Reflection.PropertyInfo[] lColors = typeof(System.Drawing.Color).GetProperties();

        foreach (PropertyInfo pi in lColors)
        {
            object val = pi.GetValue(null, null);
            if (val is Color)
            {
                Data.Add(pi.Name, (Color)val);
            }
        }
    }

    public Color GetColor(string Name)
    {
        return Data[Name];
    }
}

您可以展开此代码,直接将名称翻译为Media.Color

答案 4 :(得分:1)

Fyi,另一种更简单的方法就是使用microsoft build static class,ex Colors.Red

http://msdn.microsoft.com/en-us/library/windows/desktop/bb189018.aspx

答案 5 :(得分:0)

<块引用>

这段代码在c#、wpf中更容易Convert Hex字符串刷机

var brush = (Brush)new 
System.Windows.Media.BrushConverter().ConvertFromString("#28808080");