【.NET6+Avalonia】開發支持跨平臺的仿WPF應用程序以及基于ubuntu系統的演示

前言:隨著跨平臺越來越流行,.net core支持跨平臺至今也有好幾年的光景了。但是目前基于.net的跨平臺,大多數還是在使用B/S架構的跨平臺上;至于C/S架構,大部分人可能會選擇QT進行開發,或者很早之前還有一款Mono可以支持.NET開發者進行開發跨平臺應用。

以下內容,我使用Avalonia UI框架來開發支持可以跨平臺的應用程序(仿WPF程序)。

前提準備:

開發環境:Win10+VS2022企業版

運行環境:Win10 & Ubuntu20.04 LTS

.NET環境:.NET 6

以下,正文:

0、在開始之前,需要添加一個拓展,名稱叫 Avalonia for Visual Studio xxxx。

安裝完成以后,需要關閉所有當前運行的VS,然后會提示安裝。選擇安裝即可。

3f317fc9283d6c6387bfc86226caf813.png

1、添加拓展成功以后,在創建新項目里面,創建項目時候,會多出兩個項目選項。一個是無雙向綁定的項目,另一個是基于MVVM雙向綁定的項目。此處,我選擇基于MVVM雙向綁定的項目。

a1ac8aeb2c7d7a51fb8e0b6bbf086e1a.png

2、配置項目時候,最好對項目名稱進行小寫。大寫可能Linux系統在識別的時候會有某些意想不到的bug(人品好的可能沒有,人品不好的可以自行測試)。此處我的項目名稱命名為linuxwpf

26b4078770f717ef056130713ccbc381.png

3、新建的項目,初始項目文件以及代碼,如下圖所示。

a9fb0b3806a53e2919d3035ddcd211fb.png

4、直接運行,運行以后的畫面,如下圖所示。

d5c4dce9879def8ab695f5d2c8e005be.png

5、咱們改造一下,寫一個按鈕,然后點擊彈出提示框,意思一下。此處需要引入nuget包:MessageBox.Avalonia

c0c37fb4c710cd57e37ebbea7b092e90.png

6、引入nuget包以后,對主窗體頁面進行改寫,提供了個button,并且在對應的VM里面,添加一個Running方法,用于當做點擊觸發的綁定方法。同時方法里面提供了一個彈出消息提示框的功能。

7e5a9d92baab681dafbcb472f4dbf462.png

7、運行,驗證一下,結果如圖所示。

db3f7cf0d0b06cb89b18d6c748d87f52.png

8、按鈕綁定的方法,還可以傳輸參數,如下圖所示。跟往常傳統的WPF雙向綁定基本一致。

3d5a936b57a16036ee3365b07bf804e7.png

以上代碼:VM部分:

1354c40dc19dc338c5ecb2a02166cadf.jpeg

public class MainWindowViewModel : ViewModelBase{     //   public string Greeting => "Welcome to Avalonia!";public void Running(string msg){            var message = MessageBox.Avalonia.MessageBoxManager.GetMessageBoxStandardWindow("標題",msg);message.Show();}}

da8b37fad5834db1deef68d455794b06.jpeg

axaml部分:

6be249824d387ba64700a2dbdd790b7c.jpeg

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm="using:linuxwpf.ViewModels"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="linuxwpf.Views.MainWindow"Icon="/Assets/avalonia-logo.ico"Title="linuxwpf"><Design.DataContext><vm:MainWindowViewModel/></Design.DataContext><!--<TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>--><Button Command="{Binding Running}"  CommandParameter="Hello World" Content="點我" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Window>

92d6a00d838e7f98e778274dbd591b61.jpeg

9、運行結果,如下圖所示。

73840524a023d278e97ac87c0d1fbdf3.png

10、接下來,咱們把它部署到Linux系統上去實驗一下。需要先創建個 xxx.desktop文件,用于指定可執行文件路徑、快捷圖標路徑有關。其中,png圖片隨便搞一個就行。同時,需要對新增的這倆文件,屬性設置為“始終復制”。

600d1477a1b410f23f9fe248c9a59eff.png

以上配置代碼:

[Desktop Entry]
Name=linuxwpf
Type=Application
Exec=/usr/share/ linuxwpf/linuxwpf
Icon=/usr/share/icons/linuxwpf.png

11、在項目文件里面,新增上面倆文件的有關配置,如圖所示。

4d96431c53f74183130f30159d9644a6.png

新增的配置代碼:

15d7d8ab0d26b6b8ce16e260dfd339c2.jpeg

<ItemGroup><Content Include="linuxwpf.png" CopyToPublishDirectory="PreserveNewest"><LinuxPath>/usr/share/icons/linuxwpf.png</LinuxPath></Content><Content Include="linuxwpf.desktop" CopyToPublishDirectory="PreserveNewest"><LinuxPath>/usr/share/applications/linuxwpf.desktop</LinuxPath></Content>
</ItemGroup>

cf56db2dafb5a4769c5f0a8926f12f87.jpeg

12、然后,在程序包管理器下,或者shell窗口,或者dos窗口,輸入? dotnet tool install --global dotnet-deb

該命令的作用是,用于安裝一個可以對.net項目進行打包成deb文件的工具。deb格式文件是linux系統下的一種安裝包格式之一。

a9dfcb92299e487e6c2b07d54ea4221b.png

13、指定到項目目錄下,準備進行項目打包。

662a27fc5115f5828148d083608a42fb.png

14、先輸入 dotnet deb install 命令,用于下載 deb 工具。

301be374b64f5a7dbdbd77a60629a1c1.png

15、然后輸入? dotnet restore -r linux-x64 命令,用于重置指定的程序運行目標環境,例如 linux-x64??

b6032daacdd22efe0df78b36e61fb729.png

16、最后輸入 以下如圖所示的命令,進行發布程序。該命令會在根目錄下生成release文件夾。其中,指定操作方式是創建Deb文件,目標環境是.net6.0,以及運行時是 linux-x64環境。

64721dd8b735710a536cc2d8d15ced95.png

17、在根目錄下,可以看到生成了一個deb文件,只需要把該文件拷貝到指定的linux系統上即可(前提是linux系統是帶有圖形界面的那種)

af1dd3516185b38eefecd5639a79bef7.png

18、在遠程ubuntu系統上,新建一個測試用的文件夾叫wpf,用于存放上面的deb文件

3a5940ba2f4e09de266f2059e3116b05.png

19、使用命令,遠程直接拷貝到指定的路徑。遠程拷貝命令說明:

命令:scp -v 遠程用戶 1@遠程地址 1:/文件路徑 1/文件 1 遠程用戶 2@遠程地址 2:/文件路徑 2

解釋:從遠程服務器 1 上面的文件 1 拷貝到遠程服務器2 的文件路徑 2 文件夾下

7b8c83e93e31f9db61ad223587586a22.png

20、拷貝完成,可以開始安裝了。

03bb88d6065ed40a64d2f5b163327752.png

21、使用 dpkg -i xxx.deb命令,即可開始安裝。如果沒有dpkg命令可以用,需要先通過命令 (需要sudo權限)? apt-get install -f 進行安裝一些基礎的組件先。

18012499f25aa2b0530b0d9c1f631cbd.png

22、此處安裝完成以后,沒有顯示桌面圖標,說明有點小問題,可能原因是xxx.desktop桌面圖標文件里面配置的字符編碼不是 UTF-8或者某個路徑或配置文件配置不標準,大佬們可以自行去研究。

此處沒有桌面圖標,可以進入到安裝路徑下,在 /usr/shard/程序名稱文件夾/ 下,可以找到對應的程序文件,直接運行即可。例如此處我的程序名稱是linuxwpf,則直接運行,即打開程序窗口。通過點擊按鈕,彈出符合預期的提示框,說明該跨平臺方案是成功的。

abed8555d8ea474d76879be35b26224f.png

原文出自個人博客。地址:

https://www.cnblogs.com/weskynet/p/16006818.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SOA架構和MSA架構之間的關系

目錄 一、傳統架構&#xff1a;簡單單體模式 二、分布式架構&#xff1a;面向服務架構&#xff08;SOA&#xff09; 1、服務與SOA 2、SOA戰略 3、SOA的兩大基石&#xff1a;RPC和MQ 三、分布式架構&#xff1a;微服務架構&#xff08;MSA&#xff09; 什么是微服務 微服…

Linux系統文件與目錄權限管理

Linux文件目錄權限管理 一、Linux文件屬性及權限 1、Linux文件及目錄權限及屬性說明 &#xff08;1&#xff09;權限及屬性說明 &#xff08;2&#xff09;文件權限說明 三種權限說明&#xff1a;r 讀 read w 寫 write x 執行 excute 2、修改文件屬主及屬組 &#xff08;1&am…

一個文本分詞程序

WordMap類從分詞庫中讀入分詞 將分詞存入unordered_map<std::string, int> 中 #pragma once #include<istream> #include<unordered_map> #include<string> #include<ctime> class WordMap { public:WordMap(const std::string& filename);…

scala學習手記28 - Execute Around模式

我們訪問資源需要關注對資源的鎖定、對資源的申請和釋放&#xff0c;還有考慮可能遇到的各種異常。這些事項本身與代碼的邏輯操作無關&#xff0c;但我們不能遺漏。也就是說進入方法時獲取資源&#xff0c;退出方法時釋放資源。這種處理就進入了Execute Around模式的范疇。 在s…

【時序數據庫InfluxDB】Windows環境下配置InfluxDB+數據可視化,以及使用 C#進行簡單操作的代碼實例...

前言&#xff1a;如題。直接上手擼&#xff0c;附帶各種截圖&#xff0c;就不做介紹了。1、influxDB的官網下載地址 https://portal.influxdata.com/downloads/打開以后&#xff0c;如下圖所示&#xff0c;可以選擇版本號&#xff0c;以及平臺。此處咱們選擇windows平臺。不過…

官宣 微軟跨平臺 UI 框架 .NET MAUI 6 正式發布

微軟宣布 .NET MAUI 已正式 GA。 .NET MAUI (.NET Multi-platform App UI) 是一個跨平臺 UI 框架&#xff08;前身是 Xamarin.Forms&#xff09;&#xff0c;用于通過 C# 和 XAML 創建原生移動和桌面應用。基于 .NET MAUI&#xff0c;開發者可在單個共享代碼庫中創建同時支持 A…

92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

Reset

在常用的代碼中&#xff0c;我們使用AddForm.form.reset();或者AddForm.getForm().reset();來將FormPanel重置。 但是當頁面增加和修改公用一個formpanel時&#xff0c;當先點擊修改時&#xff0c;窗體修改顯示出數據&#xff0c;關閉窗體后&#xff08;window.hide()&#xff…

《.NET物聯網從零開始》系列

近日搞硬件網關時&#xff0c;那些殘存的數電、模電和通信原理的記憶時常在腦海中縈繞&#xff1b;想起來多年前看張高興的博客學會了.netcore樹莓派進行物聯網開發。使用dragonboard(龍板)搭載windows 10 iot系統&#xff0c;配合光電傳感器和rfid實現了一個項目原型。碰巧逛g…

設計好接口的 36 個錦囊(原則)

目錄 設計好接口的 36 個錦囊 | 接口參數校驗 | 修改老接口時&#xff0c;注意接口的兼容性 | 設計接口時&#xff0c;充分考慮接口的可擴展性 | 接口考慮是否需要防重處理 | 重點接口&#xff0c;考慮線程池隔離 | 調用第三方接口要考慮異常和超時處理 | 接口實現考慮…

嵌入式第11次實驗

嵌入式軟件設計第11次實驗報告 學號&#xff1a;140201236 姓名&#xff1a;沈樟偉 組別&#xff1a;第2組 實驗地點&#xff1a;D19 一、實驗目的&#xff1a; 1、了解短信AT指令的使用方法。 2、掌握使用短信AT指令驅動SIM900A發送和接收短信的方…

Linux文件系統之df

df用于查看當前掛載的文件系統-a 查看所有的文件系統可以自己指定容量單位&#xff0c;-BM -BG 但是還是h的選項好用-i 查看inode的使用信息-l(L) 顯示本地文件系統--output 可以指定管理員想要看的列--outputField_List可用的字段有source fstype itotal iused iavail ipcent …

普通老實人的生活

2019獨角獸企業重金招聘Python工程師標準>>> 有一個朋友&#xff0c;他家有一套營業房&#xff0c;租給了兩個年輕人&#xff0c;合同簽訂為半年&#xff0c;房租7000&#xff0c;合同到期當天&#xff0c;乙方一直沒有聯系甲方&#xff0c;說明續租或不續租&#x…

如何在 C# 中運行 Python 代碼

前言Python是一門強大的編程語言。特別的是&#xff0c;它還具有眾多出色的庫&#xff08;例如numPy&#xff0c;sciPy&#xff0c;pandas等&#xff09;&#xff0c;可以顯著簡化和加速開發。因此&#xff0c;在解決某些問題時&#xff0c;通過 Python 實現可能是最理想的方式…

Ubuntu開機默認進入命令行模式/用戶圖形界面

一、開機默認進入命令行模式 # 輸入命令&#xff1a; sudo systemctl set-default multi-user.target # 重啟&#xff1a; reboot要進入圖形界面&#xff0c;只需要輸入命令startx 從圖形界面切換回命令行&#xff1a;ctrlaltF7 二、開機默認進入圖形用戶界面 # 輸入命令&…

數組查找數字5

public class Second {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubint []a{2,1,3,4,5};for (int i0;i<a.length-1;i){if(a[i]!5){i;}}System.out.println("這組數里有5呢"); }} 轉載于:https://www.cnblogs.co…

【QGIS入門實戰精品教程】10.2:QGIS中DEM三維顯示方法

QGIS中數字高程模型DEM三維顯示方法。 參考閱讀: 【ArcGIS Pro微課1000例】0006:ArcGIS Pro 2.5三維顯示DEM數字高程模型 【ArcGIS Pro微課1000例】0005:ArcGIS Pro 2.5基于矢量數據制作拉伸三維地圖案例 ArcGIS實驗教程——實驗二十六:ArcScene實現二維數據的三維顯示 文章…

AUTH password

為redis服務請求設置一個密碼。redis可以設置在客戶端執行commands請求前需要通過密碼驗證。通過修改配置文件的requirepass就可以設置密碼。 如果密碼與配置文件里面設置的密碼一致&#xff0c;服務端就會發會一個OK的狀態碼&#xff0c;接受客戶端發送其他的請求命令&#xf…

基于Dubbo框架構建分布式服務(三)

我們將上面開發的服務提供方服務&#xff0c;部署到2個獨立的節點上&#xff08;192.168.14.1和10.10.4.125&#xff09;&#xff0c;然后可以通過Dubbo管理中心查看對應服務的狀況&#xff0c;如圖所示&#xff1a; 上圖中可以看出&#xff0c;該服務有兩個獨立的節點可以提供…

開篇-開啟全新的.NET現代應用開發體驗

01云原生技術底座暢想DaprMASA Framework研發管理研發協作平臺&#xff1a;CI/CD、Application ManagementApplication Quota Management、Version Control、Troubleshooting、Testable網格應用程序管理API網關&#xff1a;Reverse Proxy、Traffic Control 、Security Strategy…