Files
ShrlAlgoToolkit/Melskin/Converters/Internal/ColorToHexConverter.cs

47 lines
2.0 KiB
C#
Raw Normal View History

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