ColorTranslator.FromHtml 能直接解析 #RRGGBB 格式,但不支持 #RGB、#RRGGBBAA 或缺#、带空格等变体;需手动标准化字符串再用 Color.FromArgb 解析含透明度或简写格式的颜色。

ColorTranslator.FromHtml 能直接解析 #RRGGBB 吗
能,但只支持标准 Web 颜色名和 #RRGGBB 格式,不支持 #RGB、#RRGGBBAA 或带空格/前缀的变体。
常见错误现象:ColorTranslator.FromHtml("#FF5733") 正常,但 ColorTranslator.FromHtml("FF5733")(缺#)或 ColorTranslator.FromHtml("#ff5733aa")(带 alpha)会抛 ArgumentException。
- 使用场景:读取配置文件或 UI 字符串中标准 Web 颜色值,且确定格式严格为
#RRGGBB - 参数差异:不接受透明度,也不区分大小写(
#ff5733和#FF5733效果一致) - 性能影响:轻量,无反射或正则,底层走查表匹配,比手动解析快
怎么安全解析 #RGB 和 #RRGGBBAA(含透明度)
必须自己写逻辑或用 Color.FromArgb 拆解——ColorTranslator 不管这些。
关键点是先标准化字符串:去掉空格、补全位数、分离通道。比如 "#F53" → "#FF5533","#12345678" → 提取 AA 作为 alpha。
- 常见错误现象:直接传
#F53给FromHtml报错;用int.Parse(s, NumberStyles.HexNumber)解#RGBA时没移位,导致 alpha 被当 red - 使用场景:解析用户输入、CSS 导入、跨平台颜色同步(如从前端传来的带 alpha 的颜色)
- 推荐做法:用正则提取 3/4/6/8 位十六进制,再按规则扩展(
#RGB→RRGGBB,#RGBA→RRGGBBAA),最后调Color.FromArgb(int)
简短示例:
string hex = "#F53";<br>hex = Regex.Replace(hex, @"^#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$", "#$1$1$2$2$3$3"); // → "#FF5533"<br>int argb = Convert.ToInt32(hex.Replace("#", ""), 16);<br>Color c = Color.FromArgb(argb);
System.Drawing.Color 和 Windows.UI.Color 的十六进制解析区别
前者是 GDI+ 时代的 System.Drawing.Color,后者是 UWP/WinUI 的 Windows.UI.Color,两者 API 完全不兼容。
容易踩的坑:Color.FromArgb 在两个命名空间里同名但参数顺序不同——System.Drawing.Color.FromArgb(int) 是 ARGB 整数,而 Windows.UI.Color.FromArgb(byte, byte, byte, byte) 是 A/R/G/B 分离参数,且顺序固定。
- 使用场景:做 .NET MAUI / WinUI 迁移,或混合引用
System.Drawing和Windows.UI - 兼容性影响:.NET 6+ 中
System.Drawing在非 Windows 平台受限;UWP 环境下不能用ColorTranslator - 建议:跨平台项目优先用
Color.FromArgb(byte, byte, byte, byte)手动构造,避免依赖ColorTranslator
为什么 Parse 方法失败时不要只 catch Exception
因为 ColorTranslator.FromHtml 和 Color.FromArgb 抛的都是 ArgumentException,不是泛型 Exception;盲目 catch Exception 会掩盖参数校验失败之外的真实问题(比如内存溢出、委托异常)。
- 常见错误现象:写
catch (Exception)吞掉所有异常,结果颜色没变却找不到原因 - 正确做法:只捕获
ArgumentException,并检查输入字符串是否为空、是否含非法字符、长度是否合规 - 容易被忽略的地方:十六进制字符串里混入中文引号、全角空格、不可见 Unicode 字符(比如零宽空格),
Trim()不够,得用Regex.Replace(s, @"\s+", "")或更严格的清洗
事情说清了就结束











