47 lines
2.0 KiB
C#
47 lines
2.0 KiB
C#
using System.Globalization;
|
||
using System.Windows.Data;
|
||
|
||
namespace Melskin.Converters.Internal;
|
||
|
||
/// <summary>
|
||
/// 将颜色值转换为其对应的十六进制字符串表示形式的转换器。该类实现了IValueConverter接口,用于在WPF绑定中将Color类型的对象转换为十六进制颜色代码(例如#AARRGGBB格式),以及执行反向操作。
|
||
/// Convert方法接受一个Color对象作为输入,并返回一个包含Alpha、Red、Green和Blue分量的十六进制字符串。如果输入不是Color类型,则默认返回"#FFFFFFFF",代表完全不透明的白色。
|
||
/// ConvertBack方法尝试从给定的十六进制颜色字符串创建一个Color对象。它首先检查字符串是否以'#'开始;如果不是,则自动添加。然后使用内置的ColorConverter来解析这个字符串。如果提供的字符串格式错误或无法解析,则返回DependencyProperty.UnsetValue,表示转换失败。
|
||
/// </summary>
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|