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

138afe98514e3ba6b153641236d50a02.png

本文阅读目录

8a8975957fd88ecde0d1572c17bbeda0.png

1. Avalonia UI简介

Avalonia UI文档教程:https://docs.avaloniaui.net/docs/getting-started

随着跨平台越来越流行,.NET支持跨平台至今也有十几年的光景了(Mono[1]开始)。

但是目前基于.NET[2]的跨平台,大多数还是在使用B/S架构的跨平台[3]上;至于C/S架构,大部分人可能会选择Qt进行开发,或者很早之前还有一款Mono可以支持.NET开发者进行开发跨平台应用,自微软收购Xamarin后,今年又正式发布了MAUI跨平台框架[4],外加第三方的跨平台框架Uno[5][Avalonia UI](https://avaloniaui.net/ "Avalonia UI")选择,技术栈多的炸裂呀。

今天介绍的是Avalonia UI[6],站长也是研究了好几天,这是一个基于XAML[7]的跨平台UI框架,并支持多种操作系统(Windows(.NET Core),Linux(GTK),MacOS,Android和iOS),Web(WebAssembly)。

2. Avalonia UI桌面三大平台演示

这是Avalonia UI官方网站[8]的一个Demo,站长对部分Nuget包进行了升级,网友【小飞机MLA】对Linux版本修复了字体Bug得以正常运行、演示。

2.1 本文案例

一个音乐专辑搜索、展示小程序,功能如下:

  • 首页:展示已购买的音乐专辑;

  • 专辑选择页:专辑搜索、购买;

2.2 案例资料

案例教程:https://docs.avaloniaui.net/tutorials/music-store-app

案例原源码:https://github.com/AvaloniaUI/Avalonia.MusicStore

站长升级版源码:https://github.com/dotnet9/AvaloniaTest/tree/main/src/Avalonia.MusicStore

本文示例体验下载地址:https://dotnet9.com/avalonia.musicstore/publish.html

2.3 案例演示

Windows 11:

macOS 13:

可安装Rider(用EAP即可)开发,站长一次性直接编译运行(站长使用的.NET 7[9]),运行调试过于顺畅,与使用MAUI[10]相比不敢相信...

国产麒麟V10操作系统

站长安装麒麟OS[11]折腾了一会儿,文件传输不熟悉(最后使用的百度网盘中转...),运行命令也不熟(需要给运行程序设置执行权限777),后面是网友【小飞机MLA】解决了Linux字体问题,站长得以开心的运行并录了视频分享。

2.4 小缺憾

三个平台功能相同,只是Linux自定义标题栏未生效,有网友提示可以隐藏标题栏,自己实现控制按钮(最小化、最大化(还原)、关闭),后面官方应该会解决Linux下这个问题,继续研究、整!

3. Avalonia UI其他示例

3.1 网友的分享

以下内容摘自博文Avalonia学习实践(二)--跨平台支持及发布[12]。

3.1.1 支持的平台

支持的平台信息详细如下:

运行平台版本
WindowsWindows8及其以上版本(Window7也能用,但不保证没问题)
MacOSMacOS High Serra 10.13及其以上版本
LinuxDebian 9、Ubuntu 16.5、Fedora 30及其以上(主要是各种发行版)

移动端跨平台,也就是iOS和Android的支持。

Web支持,即WebAssembly,这是国际标准。

3.1.2 使用Linux内核国产操作系统的情况

操作系统研制单位备注
银河麒麟天津麒麟信息技术有限公司
中标麒麟中标软件科技有限公司原中标普华
统信UOS统信软件科技有限公司
中科方德中科方德软件有限公司
优麒麟中国CCN联合实验室基于Ubuntu发行版

发布选项:

6a744eb68b79dbc604d129a7a4bf2788.png

发布至测试环境(统信UOS、AMD处理器,所以选择linux-x64)如下:

3297eeaaa430d3a58e20f2810b780a32.png

运行效果如下:

bcf65e3a2cb32a99ba7582122adea037.gif

附.国产CPU指令集路线

国产CPU指令集
龙芯

loongarch(站长注:网友指正是 loongarch,原文是~~MIPS~~)

海光x86
兆芯x86
飞腾arm
鲲鹏arm
申威Alpha

其中龙芯是完全自主的指令集,前段时间也刚刚更新了对.Net[13]的支持;x86主要是生态好,传统桌面处理器intel、AMD都是x86架构,做兼容适配也方便些;arm以前移动端较多,现在桌面端也逐渐赶上。

3.2 其他示例

示例来自仓库Avalonia[14]

0fd628964e3c4f89ebe060119b449603.png

基于Avalonia搭建的项目部分如下:

3.2.1 Lunacy

这是一款免费设计软件,通过AI工具和内置图形保持流畅。

项目网站:https://icons8.com/lunacy

442492887d1f1b8c14b4088fb1336c28.png

以下来源于B站的一个视频:(搬运/英文)使用 Lunacy 设计一个网站首页![15]

3.2.2 Plastic

宣传语:Create without compromise:不妥协地创造

Unity Plastic SCM是一个版本控制和源代码管理工具,旨在提高团队协作和与任何引擎的可扩展性。它为艺术家和程序员提供了优化的工作流程,以及处理大型文件和二进制文件的速度。

项目网站:https://www.plasticscm.com/

73709f751d9aa8883dd5867212718a4e.png

3.2.3 WasabiWallet

用于桌面的开源、非托管比特币钱包。

项目网站:https://www.wasabiwallet.io/

a036055a0c9e5a2472160aa2eebbacfc.png

4. Avalonia UI与WPF

Maui的原生控件从命名、属性列表看和原生Android类似,但Xaml语法和WPF相同,站长使用Maui原生控件不多,只浅显地发表这部分看法,不贴相关代码,Maui学习请点这里[16]

而Avalonia UI[17]呢,和WPF[18]就几乎相同了,下面翻译原文数据绑定部分文档[19],熟悉WPF的同学可以对比:

绑定到控件

除了绑定数据到一个控件的DataContext,您还可以绑定到其他控件。

请注意,执行此操作时,绑定源是控件本身,而不是控件的DataContext. 如果你想绑定到控件DataContext,那么你需要在绑定路径中指定它。

4.1 绑定到命名控件

如果要绑定到另一个命名控件的属性,可以使用以#字符为前缀的控件名称(站长注:这里类似前端的css id选择器,其实Avalonia UI样式扩展的借鉴大部分来源于前端,站长猜测的哈)。

<TextBox Name="other"><!-- Binds to the Text property of the "other" control -->
<TextBlock Text="{Binding #other.Text}"/>

这相当于 WPF 和 UWP 用户熟悉的 long-form(长表单)绑定:

<TextBox Name="other">
<TextBlock Text="{Binding Text, ElementName=other}"/>

Avalonia 支持这两种语法,但短格式#语法不那么冗长。

4.2 绑定到祖先

您可以使用以下符号绑定到目标的逻辑父级:$parent

<Border Tag="Hello World!"><TextBlock Text="{Binding $parent.Tag}"/>
</Border>

或者通过向$parent符号添加Index(索引)来传递给祖先:

<Border Tag="Hello World!"><Border><TextBlock Text="{Binding $parent[1].Tag}"/></Border>
</Border>

索引是从 0 开始的,因此$parent[0]等同于$parent.

您还可以按类型绑定到祖先:

<Border Tag="Hello World!"><Decorator><TextBlock Text="{Binding $parent[Border].Tag}"/></Decorator>
</Border>

最后,您可以组合索引和类型:

<Border Tag="Hello World!"><Border><Decorator><TextBlock Text="{Binding $parent[Border;1].Tag}"/></Decorator></Border>
</Border>

如果您需要在祖先类型中包含 XAML 命名空间,您可以使用字符:像往常一样来做到这一点:

<local:MyControl Tag="Hello World!"><Decorator><TextBlock Text="{Binding $parent[local:MyControl].Tag}"/></Decorator>
</local:MyControl>

Avalonia 还支持 WPF/UWP 的RelativeSource语法,其功能类似但又不相同。RelativeSource适用于可视树,而此处给出的语法适用于逻辑树。

关于Avalonia UI的更多用法请点击这里[20]学习。

5. JetBrains Rider支持

JetBrains Rider现在正式支持Avalonia。对于XAML预览器添加,支持代码完成、检查和重构https://plugins.jetbrains.com/plugins/dev/14839到插件库并安装AvaloniaRider插件。

6. 常问问题

翻译自:Avalonia UI FAQ[21]

6.1 我可以编写我的UI而不是使用XAML吗?

是的。您可以使用首选的.NET语言对整个UI进行编码。

6.2 有可视化拖拽设计器吗?

不支持。Avalonia IDE扩展支持实时预览,在您修改XAML时实时刷新呈现UI的预览,从而替换拖放设计器。

6.3 Avalonia是否支持热重载?

您可以使用社区项目来启用Avalonia 的热重载。

6.4 Avalonia可以与原生API互操作吗?

是的。

6.5 我可以针对不同平台进行交叉编译吗?

是的。您可以在Windows平台上,为macOS和Linux平台编译目标程序。您可能需要在这些平台上打包您的应用程序以创建您的应用程 序的发布包。

6.6 我可以使用Avalonia构建移动应用程序吗?

是的。您现在可以为Android开发,我们有一个预览展示了iOS支持的开始。但是,您应该仔细考虑每个平台, 并确保您的应用程序在较小的触控设备上表现良好。

6.7 我可以用Avalonia建立网站吗?

它还处于早期阶段, 还没有准备好投入生产,但是是的,你可以。Avalonia现在支持Web Assembly[22]。请参考快速演示: NodeEditor Demo[23]。这意味着您的完整Avalonia应用程序可以在所有现代网络浏览器中运行。

6.8 我怎样才能参与其中?

查看社区指南[24],了解如何参与该项目。

6.9 支持哪些Linux发行版?

  • Debian 9 (Stretch)+

  • Ubuntu 16.04+

  • Fedora 30+

Skia 是针对glibc构建的。如果您的发行版使用其他东西,您需要使用SkiaSharp[25]构建您自己的libSkiaSharp.so[26]。我们仅为Intel x86-64提供预编译的二进制文件。计划支持ARM/ARM64。

6. 10支持哪些版本的macOS?

macOS High Sierra 10.13+

参考资料

[1]

Mono: https://www.mono-project.com/

[2]

.NET: https://dotnet.microsoft.com/zh-cn/

[3]

B/S架构的跨平台: https://learn.microsoft.com/zh-cn/aspnet/core/?view=aspnetcore-7.0

[4]

MAUI跨平台框架: https://learn.microsoft.com/zh-cn/dotnet/maui/?view=net-maui-7.0

[5]

Uno: https://platform.uno/

[6]

Avalonia UI: https://avaloniaui.net/

[7]

WPF XAML: https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-6.0&viewFallbackFrom=netdesktop-7.0

[8]

Avalonia UI官方网站: https://avaloniaui.net/

[9]

.NET 7: https://dotnet.microsoft.com/zh-cn/learn

[10]

MAUI: https://learn.microsoft.com/zh-cn/dotnet/maui/?view=net-maui-7.0

[11]

麒麟OS: https://www.kylinos.cn/

[12]

Avalonia学习实践(二)--跨平台支持及发布: https://blog.csdn.net/lordwish/article/details/124767653

[13]

.Net: https://dotnet.microsoft.com/zh-cn/

[14]

Avalonia: https://github.com/AvaloniaUI/Avalonia

[15]

(搬运/英文)使用 Lunacy 设计一个网站首页!: https://www.bilibili.com/video/BV1j3411b7G2/?spm_id_from=333.337

[16]

这里: https://learn.microsoft.com/zh-cn/dotnet/maui/?view=net-maui-7.0

[17]

Avalonia UI: https://avaloniaui.net/

[18]

WPF: https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-6.0

[19]

数据绑定部分文档: https://docs.avaloniaui.net/docs/data-binding/binding-to-controls#binding-to-an-ancestor

[20]

这里: https://docs.avaloniaui.net/docs/getting-started

[21]

Avalonia UI FAQ: https://docs.avaloniaui.net/misc/faq

[22]

Web Assembly: https://webassembly.org/

[23]

NodeEditor Demo: https://wieslawsoltes.github.io/NodeEditor/

[24]

社区指南: https://docs.avaloniaui.net/misc/community

[25]

SkiaSharp: https://github.com/mono/SkiaSharp

[26]

libSkiaSharp.so: https://github.com/mono/SkiaSharp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络串流_串流NBA篮球的最便宜方式(无需电缆)

网络串流I love NBA basketball. Every year, I get really excited around the beginning of September because I know tip-off is approaching. This year, I also had to figure out how I’m going to watch the Bulls (lose almost every game) with a combination of st…

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来&#xff0c; 对应到我的主力语言C#&#xff0c; 其实牵涉到闭包、foreach。为了便于理解&#xff0c;我重新组织了语言&#xff0c;以倒叙结构行文。先给大家提炼出一个C#题&#xff1a;观察for、foreach闭包的差异左边输出…

C#对window 硬件类操作,ManagementObjectSearcher

原文转载&#xff1a;http://blog.csdn.net/da_keng/article/details/50589145 纯属转载&#xff0c;复制过来方便编程时寻找。感谢作者&#xff1a;I-Awakening复制前补充&#xff1a; 在刚学C#&#xff0c;用ManagementObjectSearcher 竟然不能解析到头文件&#xff0c;需要手…

twitter批量取消关注_如何在Twitter上取消阻止“潜在敏感内容”

twitter批量取消关注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明。用过Bootstrap的同学都会被其复杂的类名标签折磨过&#xff0c;例如一个简单的按键样式&#xff0c;不论颜色或是大小&#xff0c;都需要btn-前缀声明&#xff1a; <button type"button" class"btn btn…

skype自动回复_如何在Windows 10上阻止Skype自动启动

skype自动回复Microsoft微软The Skype app included with Windows 10 now has a notification area icon. That’s great, but what if you never use Skype and don’t want it starting every time you sign in? Here’s how to get rid of it. Windows 10随附的Skype应用程…

95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!

hi&#xff0c;这里是桑小榆。最近和一个伙伴oncall了很久&#xff0c;对我的文章以及思想转变产生了很大的共鸣&#xff0c;她向我分享了一些职场经历还有成长经历等&#xff0c;她的这些经历也让我引发了一定的思考。光光&#xff0c;最近刚升任了部门主管&#xff0c;对于当…

PHP:6种GET和POST请求发送方法

在i94web博客中&#xff0c;我试过了畅言和多说两种社会化评论框&#xff0c;后来还是抛弃了畅言&#xff0c;不安全。 无论是畅言还是多说&#xff0c;我都需要从远程抓取文章的评论数&#xff0c;然后存入本地数据库。对于多说&#xff0c;请求的格式如下&#xff1a; // 获取…

3d镜头 适配_您是否应该将镜头适配器与无反光镜相机一起使用?

3d镜头 适配Canon佳能Mirrorless cameras aren’t the future, they’re the present. If you’re switching from an older DSLR, though, the obvious thing to do is just buy an adapter so you can keep using your old gear. 无反光镜相机不是未来&#xff0c;而是现在。…

C#弹窗提示并自动关闭方法

刚学C#不久&#xff0c;就写个工具&#xff0c;总结写一个简便自定义提示窗口方法&#xff0c;并自动关闭。 1.在项目添加windows form&#xff08;非user control&#xff09;&#xff0c;命名为Form_wait。 2.在Form_wait,加入需要控件与一个定时器timer1。 数字10为计时显…

dotNET 7:最小 API 使用

最小 API 并不是在 .NET 7 中才加入的&#xff0c;记得应该是在 .NET 6 中就已经提供&#xff0c;只是对我来说&#xff0c;到现在才开始使用。创建一个最小 API在 VS 2022 中创建 WebAPI 项目&#xff0c;不勾选使用控制器&#xff0c;创建出来的就是最小 API &#xff1a;不勾…

struts入门

struts工作过程&#xff1a; 反射代码&#xff1a; Class clazz Class.forName("action全路径"); Method m clazz.getMethod("execute"); Object o m.invoke(); package标签&#xff1a; 转发&#xff1a;地址栏不变 修改struts默认常量值&#xff1a; 常…

wpf office 菜单_如何带回Office 2007中的旧菜单

wpf office 菜单Using the new Ribbon feature in Office 2007 takes time to learn…time you don’t have because projects are stacking up. Today we will look at UBitMenu, a utility that puts the familiar Office 2003 menu into the 2007 ribbon. 使用Office 2007中…

Swagger UI 仅为用户暴露已授权终结点

前言当需要在生产环境中提供 Swagger UI 时&#xff0c;我们可以通过身份验证&#xff0c;控制只有授权用户才能访问 Swagger UI 页面。但是我们希望更进一步&#xff0c;每个用户只能看到授权给他的终结点&#xff0c;而不会暴露其他未授权终结点信息。比如&#xff0c; API 提…

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站&#xff0c;提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面&#xff0c;同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能&#xff0c;继用于…

帝国国王科技大学上机题解(二)

1.找到字符串中出现次数最少的字符 题目描写叙述 给定一个字符串&#xff08;长度小于50&#xff09; 找到该字符串出现次数最少的字符 假设有两个字符出现次数同样&#xff0c;并且均出现最少。那么ASCII码小的字符优先 输入 输入为一行字符串。不含空格 输出 输出出现次数最少…

如何在计算机上阅读漫画书

Reading and organizing a comic book collection on your computer is efficient and a lot of fun. Today we will look at a couple of free applications that allow you to read your favorite comic books on your computer. 在计算机上阅读和组织漫画集非常有效&#xf…

工业互联网平台实现路径

我国工业互联网平台建设虽然仍处于产业培育期&#xff0c;但是工业互联网平台也得到了初期的快速发展&#xff0c;得益于平台企业的积极投入和各地工业和信息化主管部门的大力推动&#xff0c;从平台建设推广的经验来看&#xff0c;下面谈一下个人认为传统制造企业平台战略比较…

psa name_Windows 10安全性PSA:启用自动商店更新

psa nameMicrosoft sometimes distributes important security updates through the Microsoft Store. That’s the lesson we’re learning in July 2020, when Microsoft sent an important update for Windows 10’s HEVC codecs not via Windows Update but via the Store.…

C# ListView 简单命令例子

编写工具常用到ListView控件&#xff0c;能简单列出选项&#xff0c;常用到流程校验显示。这里介绍简答显示&#xff0c;添加与删除功能。 1.添加表头&#xff0c;与显示。 this.listView1.Columns.Add("队列", 40, HorizontalAlignment.Left);this.listView1.Column…