前言

之前我写了 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 为例,先添加依赖

dotnet add package Projektanker.Icons.Avalonia.FontAwesome

Program.BuildAvaloniaApp 方法里注册

public static AppBuilder BuildAvaloniaApp() {
IconProvider.Current
.Register<FontAwesomeIconProvider>(); return AppBuilder.Configure<App>()
.UsePlatformDetect()
.LogToTrace();
}

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

xmlns:i="https://github.com/projektanker/icons.avalonia"

使用

然后就可以使用图标了

独立使用(Standalone)

<i:Icon Value="fa-brands fa-anchor" />

独立显示一个图标。

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

<Button i:Attached.Icon="fa-brands fa-anchor" />

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

附加到菜单项(MenuItem)(Attached to MenuItem)

<MenuItem Header="关于" i:MenuItem.Icon="fa-solid fa-circle-info" />

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

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

<i:Icon Value="fa-brands fa-anchor" FontSize="24" />

设置图标字体大小为 24。

添加动画效果(Animated)

<i:Icon Value="fa-spinner" Animation="Pulse" />
<i:Icon Value="fa-sync" Animation="Spin" />

为图标添加动画:

  • Pulse:跳动效果

  • Spin:旋转效果

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

<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 为例

dotnet add package IconPacks.Avalonia.FontAwesome

添加命名空间

xmlns:iconPacks="https://github.com/MahApps/IconPacks.Avalonia"

注册到 Applications styles

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

PackIcon 控件

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

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

PackIcon<包名>

例如使用 FontAwesome 的图标:

<iconPacks:PackIconFontAwesome Kind="SolidAnchor"
Width="24"
Height="24" />

或者:

<iconPacks:PackIconFontAwesome Kind="BrandsGithub"
Width="24"
Height="24" />

通用控件 PackIconControl

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

仅在主包 IconPacks.Avalonia 中可用。

<iconPacks:PackIconControl Kind="{x:Static iconPacks:PackIconFontAwesomeKind.SolidAnchor}"
Width="24"
Height="24" />

PackIcon 标记扩展(MarkupExtensions)

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

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

<Button Content="{iconPacks:FontAwesome SolidAnchor}" />

或者使用参数形式:

<Button Content="{iconPacks:FontAwesome Kind=SolidAnchor}" />

还可以设置大小:

<Button Content="{iconPacks:FontAwesome SolidAnchor, Width=32, Height=32}" />

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

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

PackIcon 图像标记扩展(Image MarkupExtensions)

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

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

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

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

PackIcon 图像转换器(ImageConverter)

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

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

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

<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+)还多……

提升Avalonia UI质感,跨平台图标库选型实践的更多相关文章

  1. .NET跨平台框架选择之一 - Avalonia UI

    本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...

  2. 阿里巴巴矢量图标库(Iconfont)-利于UI和前端的搭配

    前端时间,做一个小网站的时候,需要用到很多小图标,UI设计好之后不知道如何使用,如果使用图片那会很麻烦,相信一些前端更喜欢iconfont这样的标签直接调用,这样包括颜色和大小以及使用都更方便快捷,于 ...

  3. Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库

    使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...

  4. Vue + Element UI 实现权限管理系统(第三方图标库)

    使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...

  5. .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作

    Avalonia 是一个跨平台的 .NET UI 框架,支持 Windows.Linux.Mac OSX... (以及Android  IOS soon..) 本篇主要介绍Avalonia开发过程和L ...

  6. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...

  7. 【Dotnet 工具箱】跨平台图表库 LiveCharts2

    你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用! LiveCharts2 LiveCharts2 是一个简单.灵活.交互式以及功能强大的跨平台图表库. ...

  8. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  9. php大力力 [037节] Iconfont-阿里巴巴矢量图标库

    Iconfont-阿里巴巴矢量图标库 从此不求人:自主研发一套PHP前端开发框架 Iconfont-中国第一个最大且功能最全的矢量图标库,提供矢量图标下载.在线存储.格式转换等功能.阿里巴巴体验团队倾 ...

  10. 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...

随机推荐

  1. IvorySQL v4 逻辑复制槽同步功能解析:高可用场景下的数据连续性保障

    功能简介 IvorySQL v4 基于 PostgreSQL 17,引入了逻辑复制槽同步至热备份数据库的功能.这一改进有效解决了旧版本中主数据库与备份数据库切换后逻辑复制中断的问题.对于那些追求数据高 ...

  2. StarRocks 升级注意事项

    前段时间升级了生产环境的 StarRocks,从 3.3.3 升级到了 3.3.9,期间还是踩了不少坑所以在这里记录下. 因为我们的集群使用的是存算分离的版本,也是使用官方提供的 operator 部 ...

  3. openssl基础使用(密码学 linux)

    目录        实验原理        实验过程            一.对称加密                1.使用rc4加解密                2.使用AES加解密     ...

  4. docker网络冲突解决(修改docker_gwbridge网段)

    1·问题 一次生产搭建服务的时候,出现客户端服务器到docker服务断开不通的情况,在docker服务器上抓包可以抓到客户端服务器的包,但是docker服务器不做任何响应 于是ip route 查看本 ...

  5. Pydantic字段级校验:解锁@validator的12种应用

    title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: ...

  6. Assets, Resources and AssetBundles(五):AssetBundle usage patterns

    这是系列文章中的第五章,内容涉及"Unity5"中的资产.资源和资源管理. 本系列的前一章介绍了AssetBundles的基本原理,其中包括各种加载API的低级行为.本章讨论了在实 ...

  7. CSP - J理论(2)

    CSP - J理论(2) CSP-J理论合集跳转 目录 本目录中所有标题单击均可以快速跳转哦

  8. 详细介绍Mybatis的缓存机制

    一.缓存机制 1.缓存概述 缓存:缓存就是一块内存空间,保存临时数据 作用:将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取时直接从缓存中获取,可以减少和数据库交互的次数,提升程序的性 ...

  9. centos firewall防火墙操作指令记录

    1. 查看防火墙状态 systemctl status firewalld.service 2. 关闭防火墙 systemctl stop firewalld.service 3. 开机自动关闭防火墙 ...

  10. Asp.net mvc基础(十一)数据验证

    1.获取验证失败错误 asp.net mvc会自动根据属性的类型进行基本的校验,但Asp.net mvc并不是在请求验证失败的时候抛异常,而是把决定权交给开发人员,开发人员需要决定如何处理数据校验失败 ...