本文閱讀目錄

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 支持的平臺
支持的平臺信息詳細如下:
運行平臺 | 版本 |
---|---|
Windows | Windows8及其以上版本(Window7也能用,但不保證沒問題) |
MacOS | MacOS High Serra 10.13及其以上版本 |
Linux | Debian 9、Ubuntu 16.5、Fedora 30及其以上(主要是各種發行版) |
移動端跨平臺,也就是iOS和Android的支持。
Web支持,即WebAssembly,這是國際標準。
3.1.2 使用Linux內核國產操作系統的情況
操作系統 | 研制單位 | 備注 |
---|---|---|
銀河麒麟 | 天津麒麟信息技術有限公司 | |
中標麒麟 | 中標軟件科技有限公司 | 原中標普華 |
統信UOS | 統信軟件科技有限公司 | |
中科方德 | 中科方德軟件有限公司 | |
優麒麟 | 中國CCN聯合實驗室 | 基于Ubuntu發行版 |
發布選項:

發布至測試環境(統信UOS、AMD處理器,所以選擇linux-x64)如下:

運行效果如下:
附.國產CPU指令集路線
國產CPU | 指令集 |
---|---|
龍芯 | loongarch(站長注:網友指正是 loongarch,原文是~~MIPS~~) |
海光 | x86 |
兆芯 | x86 |
飛騰 | arm |
鯤鵬 | arm |
申威 | Alpha |
其中龍芯是完全自主的指令集,前段時間也剛剛更新了對.Net[13]的支持;x86主要是生態好,傳統桌面處理器intel、AMD都是x86架構,做兼容適配也方便些;arm以前移動端較多,現在桌面端也逐漸趕上。
3.2 其他示例
示例來自倉庫Avalonia[14]。

基于Avalonia搭建的項目部分如下:
3.2.1 Lunacy
這是一款免費設計軟件,通過AI工具和內置圖形保持流暢。
項目網站:https://icons8.com/lunacy

以下來源于B站的一個視頻:(搬運/英文)使用 Lunacy 設計一個網站首頁![15]
3.2.2 Plastic
宣傳語:Create without compromise:不妥協地創造
Unity Plastic SCM是一個版本控制和源代碼管理工具,旨在提高團隊協作和與任何引擎的可擴展性。它為藝術家和程序員提供了優化的工作流程,以及處理大型文件和二進制文件的速度。
項目網站:https://www.plasticscm.com/

3.2.3 WasabiWallet
用于桌面的開源、非托管比特幣錢包。
項目網站:https://www.wasabiwallet.io/

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