Avalonia颜色字符串和颜色对象转换

010 Avalonia 颜色字符串和颜色对象转换

1. 前言

之前写 WPF 的时候,颜色转换如字符串#66CCFF 转为对应的颜色我真的写了一个轮子,后面才发现 WPF 里面就有这样的方法,直到现在我仍然对之前项目中这个多余的轮子而耿耿于怀,为此在研究 Avalonia 的这个过程中,我希望先来看一下 Avalonia 本身的字符串转颜色和颜色转字符串的手段。

2. 从字符串创建 Brush

你可以通过这种方式创建Brush,但是它没有 TryParse,为此,一个非法的输入会导致出现异常,异常就像这个样子:System.FormatException:“Invalid brush string: 'aqua11'.”

2.1 颜色名称转 Brush

var brush = Brush.Parse("aqua");

2.2 Hex 转 Brush

var brush = Brush.Parse("#66CCFF");

评价:推荐度一般,因为没有 TryParse,如果解析异常,就会整个报错,也不会因为错误而返回空,这种设计也挺好的,只是在一些颜色取值的一些 UI 交互时,如果每次都要用 TryCatch 包起来调用,但是还是有些性能焦虑(虽然也损失不到哪里去就是了),可以一试但是我可能会选择别的方式实现。

3. 从字符串创建 Color

Color 转 Brush 的写法相信大家都知道,但是我们还是写一下:

var color = Color.FromRgb(255, 255, 0);
var brush = new SolidColorBrush(color);

和 Brush 是差不多的,但是多了 TryParse,会更加科学一些。

先来看看非常自信的 Parse 写法:

3.1 颜色名称转 Color

var color = Color.Parse("aqua");

3.2 Hex 转 Color

var color = Color.Parse("#66ccff");

然后再来看一下 TryParse 的做法

3.3 颜色名称转 Color TryParse

if(Color.TryParse("aqua", out var color))
{
    // TODO 转换成功
}
else
{
    // TODO 转换失败
}

3.4 Hex 转 Color TryParse

if(Color.TryParse("#66ccff", out var color))
{
    // TODO 转换成功
}
else
{
    // TODO 转换失败
}

4. Color 转 Hex 字符串

我们既然能够从 Hex 转为颜色,有的时候希望能从 RGB 颜色用 Hex 字符串,这又该怎么办呢。

var color = Colors.Red;
var hex =  ColorToHexConverter.ToHexString(color, AlphaComponentPosition.Leading);
Debug.WriteLine(hex);

结果如下:

FFFF0000

如果所见这种参数下,你可以发现没有 # 符号前导,而且你可能不在意最开始的 Alpha 值,希望能够将它去掉,这些的做法可以通过参数的调整实现:

var color = Colors.Red;
var hex =  ColorToHexConverter.ToHexString(color, AlphaComponentPosition.Leading, false, true);
Debug.WriteLine(hex);

上文的结果是这个:

#FF0000

这会不会更符合你的期待?

posted @ 2024-05-27 11:09  fanbal  阅读(445)  评论(0)    收藏  举报