Files
Shrlalgo.RvKits/Melskin/Converters/Internal/ColorToHexConverter.cs
2026-02-17 22:17:13 +08:00

47 lines
2.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}