using System.Globalization; using System.Windows.Data; namespace Melskin.Converters.Internal; /// /// 将颜色值转换为其对应的十六进制字符串表示形式的转换器。该类实现了IValueConverter接口,用于在WPF绑定中将Color类型的对象转换为十六进制颜色代码(例如#AARRGGBB格式),以及执行反向操作。 /// Convert方法接受一个Color对象作为输入,并返回一个包含Alpha、Red、Green和Blue分量的十六进制字符串。如果输入不是Color类型,则默认返回"#FFFFFFFF",代表完全不透明的白色。 /// ConvertBack方法尝试从给定的十六进制颜色字符串创建一个Color对象。它首先检查字符串是否以'#'开始;如果不是,则自动添加。然后使用内置的ColorConverter来解析这个字符串。如果提供的字符串格式错误或无法解析,则返回DependencyProperty.UnsetValue,表示转换失败。 /// internal class ColorToHexConverter : IValueConverter { public static readonly ColorToHexConverter Instance = new(); public object Convert(object? value, Type t, object? p, CultureInfo c) => value is Color color ? $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}".ToUpper() : "#FFFFFFFF"; public object? ConvertBack(object? value, Type t, object? p, CultureInfo c) { if (value is not string hexStr || string.IsNullOrWhiteSpace(hexStr)) { return DependencyProperty.UnsetValue; } var processedHex = hexStr.Trim(); // 如果用户没有输入 '#',自动为他们添加 if (!processedHex.StartsWith("#")) { processedHex = "#" + processedHex; } try { // 使用内置的 ColorConverter,它非常强大,能处理各种有效格式 return ColorConverter.ConvertFromString(processedHex); } catch { // 如果转换失败(例如,格式错误),则忽略此次输入 return DependencyProperty.UnsetValue; } } }