提升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 为例,先添加依赖
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质感,跨平台图标库选型实践的更多相关文章
- .NET跨平台框架选择之一 - Avalonia UI
本文阅读目录 1. Avalonia UI简介 Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started 随着跨平台越来越流行, ...
- 阿里巴巴矢量图标库(Iconfont)-利于UI和前端的搭配
前端时间,做一个小网站的时候,需要用到很多小图标,UI设计好之后不知道如何使用,如果使用图片那会很麻烦,相信一些前端更喜欢iconfont这样的标签直接调用,这样包括颜色和大小以及使用都更方便快捷,于 ...
- Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库
使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...
- Vue + Element UI 实现权限管理系统(第三方图标库)
使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...
- .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作
Avalonia 是一个跨平台的 .NET UI 框架,支持 Windows.Linux.Mac OSX... (以及Android IOS soon..) 本篇主要介绍Avalonia开发过程和L ...
- .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了
上一章回顾: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...
- 【Dotnet 工具箱】跨平台图表库 LiveCharts2
你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用! LiveCharts2 LiveCharts2 是一个简单.灵活.交互式以及功能强大的跨平台图表库. ...
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...
- php大力力 [037节] Iconfont-阿里巴巴矢量图标库
Iconfont-阿里巴巴矢量图标库 从此不求人:自主研发一套PHP前端开发框架 Iconfont-中国第一个最大且功能最全的矢量图标库,提供矢量图标下载.在线存储.格式转换等功能.阿里巴巴体验团队倾 ...
- 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...
随机推荐
- 『Plotly实战指南』--柱状图绘制基础篇
柱状图作为最基础的数据可视化形式之一,能直观展示不同类别数据的对比关系,适用于一下的场景: 比较不同类别之间的数据大小,如不同产品的销售额对比. 展示数据的分布情况,如各年龄段的人口数量分布. 分析时 ...
- Oracle 内存(SGA,PGA)详细介绍
一.名词解释(1)SGA:SystemGlobal Area是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池.数据缓冲区.日志缓冲区.(2)共享 ...
- 《视觉SLAM十四讲》第13讲 设计SLAM系统 回环检测线程的实现
<视觉SLAM十四讲>第13讲 设计SLAM系统 回环检测线程的实现 这个学期看完了高翔老师的<视觉SLAM十四讲>,学到了很多,首先是对计算机视觉的基本知识有了一个更加全面系 ...
- 【Pandas】concat方法使用注意点
使用pandas库的concat做数据拼接需要注意,应该先对原始数据设置列名,如果没有设置列名,在拼接时只会保留第一个文件的第一行(以列名形式),由于剩下的文件在读取时会自动将第一行作为列名,这样就会 ...
- CompletableFuture原理及应用场景详解
1.应用场景 现在我们打开各个APP上的一个页面,可能就需要涉及后端几十个服务的API调用,比如某宝.某个外卖APP上,下面是某个外卖APP的首页.首页上的页面展示会关联很多服务的API调用,如果使用 ...
- 1001: 【编程入门】A+B 输入输出练习I
1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...
- ASP.NET Core 响应压缩中间件
使用及对比 在 Startup.cs 中添加服务并使用即可,主代码如下: // Startup.cs public void ConfigureServices(IServiceCollection ...
- RegisterClass注册后getclass总是nil,why?
这个问题有点老.但是有点烦人. 一般流程是 RegisterClass后通过getclass or findclass就会成功. 可是莫名其妙出现总是返回nil.咱也不清楚,网上找了好久,一个久远的帖 ...
- 时区转换工具+PWA离线网页
时区转换工具+PWA离线网页 一.时区转换工具对比 工具 说明 Date 原生 JS API,有限的时区支持,无法指定时区,仅使用本地时区. Intl.DateTimeFormat 原生格式化显示,可 ...
- 为什么 MySQL 选择使用 B+ 树作为索引结构?
为什么 MySQL 选择使用 B+ 树作为索引结构? MySQL 选择 B+ 树作为其索引结构的主要原因是它具有以下几个优势,这些优势使得 B+ 树非常适合用于数据库系统中的索引实现. 1. 高效的范 ...