如何区分ARGB值相同的Black与ActiveCaptionText两种系统颜色?
结论
如果你只有单独的ARGB int数值,无法直接区分这两个颜色,因为默认系统主题下二者的ARGB值完全一致,数值层面没有任何差异。
如果你的业务需要区分「标准色」和「系统主题关联的颜色」,可以参考下面的方案:
方案1:持有Color对象时直接判断
如果你的数据源可以保留Color对象而非仅存储ARGB int值,可以直接使用Color结构自带的两个属性区分:
IsSystemColor:判断该颜色是否属于系统主题关联的颜色Color.FromName("Black").IsSystemColor返回falseColor.FromName("ActiveCaptionText").IsSystemColor返回true
KnownColor:直接获取该颜色对应的KnownColor枚举值,无需自行映射。
方案2:仅持有ARGB int值时自定义优先级映射
如果你只能拿到ARGB int值,可以自行构建映射字典,根据业务需求设置名称返回优先级:
- 如果你希望优先返回标准色名,遇到相同ARGB时返回
Black - 如果你希望优先返回系统主题色名,遇到相同ARGB时返回
ActiveCaptionText
示例代码如下:
// 构建优先级映射,这里演示优先匹配标准色 Dictionary<int, string> argb2NameMap = new Dictionary<int, string>(); // 先加入所有非系统的标准色,优先级更高 foreach (KnownColor kc in Enum.GetValues<KnownColor>()) { Color color = Color.FromKnownColor(kc); if (!color.IsSystemColor && !argb2NameMap.ContainsKey(color.ToArgb())) { argb2NameMap[color.ToArgb()] = kc.ToString(); } } // 再加入系统颜色,已存在的ARGB不覆盖 foreach (KnownColor kc in Enum.GetValues<KnownColor>()) { Color color = Color.FromKnownColor(kc); if (color.IsSystemColor && !argb2NameMap.ContainsKey(color.ToArgb())) { argb2NameMap[color.ToArgb()] = kc.ToString(); } } // 使用示例 int inputArgb = -16777216; if (argb2NameMap.TryGetValue(inputArgb, out string colorName)) { Console.WriteLine(colorName); // 输出 Black }
补充说明
你现在测试得到二者ARGB相等只是默认系统主题的情况,如果用户手动修改了系统主题的标题栏文本颜色,ActiveCaptionText的ARGB值会发生变化,此时和Black的返回值就会不同。
内容的提问来源于stack exchange,提问作者Vlad Sandu
相关产品推荐
相关产品推荐

