提升Avalonia UI质感,跨平台图标库选型实践

前言

之前我写了 StarBlog 发布工具更新了版本,优化了一下界面,其中就把 emoji 表情换成了 FontAwesome 图标

emoji 如果只在一个系统上用(如 Windows)

那可能没啥问题

但我多个设备之间切换,就发现在 macOS 上效果不好,有些 emoji 显示得和 Windows 不一样

现在全部换成 Font Awesome 了,统一美观很多。感觉换图标这件事就可以单独写一篇文章了。

Avalonia 的生态还可以,有不同的图标库可选,本文主要介绍两个。

  • Icon.Avalonia
  • IconPacks.Avalonia

Icon.Avalonia

https://github.com/Projektanker/Icons.Avalonia

这个库支持两种图标,目前 Star 数量 365

我在 StarBlog Publisher 工具里使用的就是这个库,用起来蛮简单的。

安装

这里以 FontAwesome 为例,先添加依赖

bash 复制代码
dotnet add package Projektanker.Icons.Avalonia.FontAwesome

Program.BuildAvaloniaApp 方法里注册

c# 复制代码
public static AppBuilder BuildAvaloniaApp() {
  IconProvider.Current
    .Register<FontAwesomeIconProvider>();

  return AppBuilder.Configure<App>()
    .UsePlatformDetect()
    .LogToTrace();
}

在布局文件里添加命名空间

xml 复制代码
xmlns:i="https://github.com/projektanker/icons.avalonia"

使用

然后就可以使用图标了

独立使用(Standalone)

xaml 复制代码
<i:Icon Value="fa-brands fa-anchor" />

独立显示一个图标。

附加到内容控件(例如 Button)(Attached to ContentControl,例如按钮)

xaml 复制代码
<Button i:Attached.Icon="fa-brands fa-anchor" />

将图标附加到按钮等控件中。

xaml 复制代码
<MenuItem Header="关于" i:MenuItem.Icon="fa-solid fa-circle-info" />

在菜单项中添加图标,例如"关于"菜单。

自定义图标大小(Custom icon size)

xaml 复制代码
<i:Icon Value="fa-brands fa-anchor" FontSize="24" />

设置图标字体大小为 24。

添加动画效果(Animated)

xaml 复制代码
<i:Icon Value="fa-spinner" Animation="Pulse" />
<i:Icon Value="fa-sync" Animation="Spin" />

为图标添加动画:

  • Pulse:跳动效果

  • Spin:旋转效果

作为图像源使用(As an Image source)

xaml 复制代码
<Image>
  <Image.Source>
    <i:IconImage Value="fa-brands fa-anchor" Brush="(默认为黑色)" />
  </Image.Source>
</Image>

将图标作为图像显示,可通过 Brush 设置颜色(默认黑色)。

IconPacks.Avalonia

https://github.com/MahApps/IconPacks.Avalonia

这个库支持的图标就多了,不过很奇怪,Star 数量才 62

支持以下这么多图标...😂,非常丰富!

  • BootstrapIcons
  • BoxIcons
  • CircumIcons
  • Codicons
  • Coolicons
  • Entypo
  • EvaIcons
  • FeatherIcons
  • FileIcons
  • Fontaudio
  • FontAwesome
  • Fontisto
  • ForkAwesome
  • GameIcons
  • Ionicons
  • JamIcons
  • Lucide
  • Material
  • MaterialLight
  • MaterialDesign
  • MemoryIcons
  • Microns
  • Modern
  • Octicons
  • PhosphorIcons
  • PicolIcons
  • PixelartIcons
  • RadixIcons
  • RemixIcon
  • RPGAwesome
  • SimpleIcons
  • Typicons
  • Unicons
  • VaadinIcons
  • WeatherIcons
  • Zondicons

安装

这里也是以 FontAwesome 为例

bash 复制代码
dotnet add package IconPacks.Avalonia.FontAwesome

添加命名空间

xml 复制代码
xmlns:iconPacks="https://github.com/MahApps/IconPacks.Avalonia"

注册到 Applications styles

xml 复制代码
<Application.Styles>
  <FluentTheme />

  <StyleInclude Source="avares://IconPacks.Avalonia/Icons.axaml" />
  <StyleInclude Source="avares://IconPacks.Avalonia.FontAwesome/Icons.axaml" />
</Application.Styles>

PackIcon 控件

PackIcon 控件是使用图标包中图标的主要方式。

每个图标包都有各自的控件,命名格式如下:

复制代码
PackIcon<包名>

例如使用 FontAwesome 的图标:

xaml 复制代码
<iconPacks:PackIconFontAwesome Kind="SolidAnchor"
                               Width="24"
                               Height="24" />

或者:

xaml 复制代码
<iconPacks:PackIconFontAwesome Kind="BrandsGithub"
                               Width="24"
                               Height="24" />

通用控件 PackIconControl

PackIconControl 是一个通用控件,可以用来显示任何图标包中的图标。

仅在主包 IconPacks.Avalonia 中可用。

xaml 复制代码
<iconPacks:PackIconControl Kind="{x:Static iconPacks:PackIconFontAwesomeKind.SolidAnchor}"
                           Width="24"
                           Height="24" />

PackIcon 标记扩展(MarkupExtensions)

更快捷的方式是使用 PackIcon 的标记扩展(MarkupExtension)来设置 ContentControl 的内容。

例如,你可以在 Button 中添加 FontAwesome 图标:

xaml 复制代码
<Button Content="{iconPacks:FontAwesome SolidAnchor}" />

或者使用参数形式:

xaml 复制代码
<Button Content="{iconPacks:FontAwesome Kind=SolidAnchor}" />

还可以设置大小:

xaml 复制代码
<Button Content="{iconPacks:FontAwesome SolidAnchor, Width=32, Height=32}" />

如果使用的是主包,还可以使用通用写法:

xaml 复制代码
<Button Content="{iconPacks:PackIcon {x:Static iconPacks:PackIconFontAwesomeKind.SolidAnchor}, Width=32, Height=32}" />

PackIcon 图像标记扩展(Image MarkupExtensions)

还可以将图标作为图片使用:

xaml 复制代码
<Image Source="{iconPacks:FontAwesomeImage Kind=SolidAnchor, Brush=DarkBlue}"
       Width="24" Height="24"
       HorizontalAlignment="Left" Margin="10" />

也可以使用通用写法(主包中可用):

xaml 复制代码
<Image Source="{iconPacks:PackIconImage Kind={x:Static iconPacks:PackIconFontAwesomeKind.SolidAnchor}, Brush=DarkOrange}"
       Width="24" Height="24"
       HorizontalAlignment="Left" Margin="10" />

PackIcon 图像转换器(ImageConverter)

还可以使用图标转换器将绑定的数据转换为图标图像:

xaml 复制代码
<Image Source="{Binding #FontAwesomeKindComboBox.SelectedItem, Mode=OneWay, Converter={iconPacks:PackIconFontAwesomeKindToImageConverter Brush=Crimson}}"
       Width="24" Height="24"
       HorizontalAlignment="Left" Margin="10" />

主包中还提供了一个通用转换器:

xaml 复制代码
<Image Source="{Binding #FontAwesomeKindComboBox.SelectedItem, Mode=OneWay, Converter={iconPacks:PackIconKindToImageConverter Brush=Crimson}}"
       Width="24" Height="24"
       HorizontalAlignment="Left" Margin="10" />

如需进一步了解 FontAwesome 支持的图标类型(Solid、Regular、Brands 等),可以查看 PackIconFontAwesomeKind 枚举,或在 IDE 中代码补全里查看所有可用图标名称。

图标浏览工具

https://github.com/MahApps/IconPacks.Browser

这个 IconPacks 还提供了个图标浏览器,可以很方便的搜索图标和复制代码

确实是非常完善了~

不过让我没想到的事,这个图标浏览器的Star(170+)比图标本体(60+)还多......😂

相关推荐
八苦4 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术6 小时前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德6 小时前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
程序员老乔9 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#
祝大家百事可乐10 小时前
嵌入式——02 数据结构
c++·c#·硬件工程
我是唐青枫10 小时前
深入理解 C#.NET TaskScheduler:为什么大量使用 Work-Stealing
c#·.net
唯情于酒12 小时前
net core web api 使用log4net
c#·.net core
SunnyDays101113 小时前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
人工智能AI技术13 小时前
Qwen3.5-Plus登顶|C#集成通义千问,高并发服务实战优化
人工智能·c#
SunnyDays101114 小时前
如何使用 C# 在 Word 文档中插入超链接 (含文本与图片链接)
开发语言·c#