将类似于#XXXXXX的颜色字符串转换为System.Windows.Media.Brush的最简单方法

13

我认为标题已经很清楚了!

现在我拥有的是:

System.Drawing.Color uiui = System.Drawing.ColorTranslator.FromHtml(myString);
var intColor = (uint)((uiui.A << 24) | (uiui.R << 16) | (uiui.G << 8) | (uiui.B << 0));
var bytes = BitConverter.GetBytes(uint.Parse(value));
var brush = new SolidColorBrush();
brush.Color = Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]);

1- 我的字符串像标题中提到的那样,类似于 #FFFFFF

2- 这在 BitConverter.GetBytes 行失败了,这让我很惊讶,因为我已经将我的 Color 转换成了整数表示!

3- 不管怎样,我知道颜色转换并不那么直观,但我感觉我做得不对...这是正确的方法吗?


我一直认为0xFFFFFF可以通过每16个字节进行转换为RGB。换句话说,就是0XFF、0XFF和0XFF。 - Security Hound
这个问题的答案是针对WPF Media Color特定的,我认为它并不是真正的重复。 - Anthony Shaw
@AnthonyShaw 从 Media.Color 到 Media.SolidColorBrush 的转换很简单,但我还是回答了这个问题。 - Ray
差异更多地涉及字符串表示的不同。 - Guillaume Slashy
3个回答

36
您可以使用 System.Windows.Media.ColorConverter
var color = (Color)ColorConverter.ConvertFromString("#FF010203");
//OR
var color = (Color)ColorConverter.ConvertFromString("#010203");
//OR
var color = (Color)ColorConverter.ConvertFromString("Red");

//and then:
var brush = new SolidColorBrush(color);  

它对接受的内容非常灵活。请查看此处的XAML示例。您可以传递其中任何字符串格式。

注意:这些都在System.Windows.Media中(用于WPF),不要与System.Drawing(用于WinForms)混淆。


这段代码在我的示例中运行良好:var color = (Color)ColorConverter.ConvertFromString("#FF" + myString.Substring(1)); - Guillaume Slashy
1
@GuillaumeSlashy 你不应该这样做,它非常智能。如果是 #XXXXXX,只需将字符串放入即可。 - Ray

2

这是我过去使用过的帮助类

    public static Color HexStringToColor(string hexColor)
    {
        string hc = ExtractHexDigits(hexColor);
        if (hc.Length != 6)
        {
            // you can choose whether to throw an exception
            //throw new ArgumentException("hexColor is not exactly 6 digits.");
            return Color.Empty;
        }
        string r = hc.Substring(0, 2);
        string g = hc.Substring(2, 2);
        string b = hc.Substring(4, 2);
        Color color = Color.Empty;
        try
        {
            int ri = Int32.Parse(r, NumberStyles.HexNumber);
            int gi = Int32.Parse(g, NumberStyles.HexNumber);
            int bi = Int32.Parse(b, NumberStyles.HexNumber);
            color = Color.FromArgb(ri, gi, bi);
        }
        catch
        {
            // you can choose whether to throw an exception
            //throw new ArgumentException("Conversion failed.");
            return Color.Empty;
        }
        return color;
    }

还有一个额外的辅助类

        public static string ExtractHexDigits(string input)
        {
            // remove any characters that are not digits (like #)
            var isHexDigit
                = new Regex("[abcdefABCDEF\\d]+", RegexOptions.Compiled);
            string newnum = "";
            foreach (char c in input)
            {
                if (isHexDigit.IsMatch(c.ToString()))
                {
                    newnum += c.ToString();
                }
            }
            return newnum;
        }

1
你应该查找 ColorConverter。有一个适用于 WinForms,另一个适用于 WPF。 - Ray
这很棒,我不知道它的存在。谢谢 Ray! - Anthony Shaw

0

只需使用ColorTranslator方法:

ColorTranslator.FromHtml("#010203");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接