提升Avalonia UI质感,跨平台图标库选型实践
本文介绍了在Avalonia框架下使用两种图标库(Icon.Avalonia和IconPacks.Avalonia)的详细方法。作者通过对比不同设备间emoji显示不一致的问题,引出使用FontAwesome图标的优势。文章重点讲解了两种库的安装步骤、XAML配置方法及实际应用场景,包括独立图标显示、控件附加、动画效果实现等。其中IconPacks.Avalonia支持35种图标集,功能更为丰富,还提供了图标浏览器工具。全文通过具体代码示例,为开发者提供了实用的技术参考。
目录18 个章节
前言
之前我写了 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+)还多……😂
_EOF_
提升Avalonia UI质感,跨平台图标库选型实践
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
Blazor Hybrid 实战体验:那些你可能没预料到的坑
接下来我会找时间试一下 Electron 和 wails 的开发体验,进一步探索 Blazor Hybrid 在桌面软件开发中的优势。
2025-03-27 · Desktop · 约 1 分钟
PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
国庆假期各种活动比较多,直到上班才有时间来更新文章~ 不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具 QuickCutSharp 加个功能,不过这个软件是基于 WinForms 开发的,做界面得拖拉控件,感觉繁琐又不灵活,于是索性重新做一个。
2025-03-27 · Desktop · 约 1 分钟
聊聊几个相见恨晚的WinForm界面库
前阵子在逛知乎的时候看到了Gitee发的文章,里面介绍了一些WinForm开源项目,其中就有涉及到界面库,我一下子就来了兴趣,然后顺瓜摸藤又找到了几个类似的界面库,看着熟悉的界面和代码,有一种「爷的青春回来了」的感觉~ 可惜属于WinForm的短暂时代早已结束,当今Web统治一切,怕是WinForm以后只能用来追忆往事了吧…… SunnyUI 看看作者的截图: 对话框: 看这界面颇有年代感,很惊讶
2025-03-27 · Desktop · 约 1 分钟
AOT编译Avalonia应用:StarBlog Publisher项目实践与挑战
本文介绍了作者使用Avalonia框架开发的跨平台文章发布工具StarBlog Publisher,并详细记录了使用AOT(Ahead-Of-Time)技术发布Avalonia应用的过程及遇到的问题。文章讨论了AOT的优缺点、配置方法,并针对JSON序列化、类型注册等问题提供了解决方案。作者分享了使用Newtonsoft.Json库和rd.xml文件等技巧,以优化AOT发布的性能和兼容性。
2025-04-27 · Desktop · 约 1 分钟
讨论
共 0 条加载评论中…