dotnet 在 UOS 國產系統上使用 Xamarin Forms 創建 xaml 界面的 GTK 應用

2021-03-02 移動開發和人工智慧

在前面幾篇博客告訴大家如何部署 GTK 應用,此時的應用是特別弱的,大概只是到拖控制項級。儘管和 WinForms 一樣也能寫出特別強大的應用,但是為了提升一點開發效率,咱開始使用 xaml 神器寫界面。本文告訴大家如何在 UOS 國產系統上,通過 Xamarin.Forms 使用 XAML 寫界面邏輯,構建出 GTK 應用

本文將使用特別底層的方法告訴大家如何一步步創建,而不是告訴大家如何在 IDE 上進行快速的創建。因此本文更適合用來告訴大家一些基礎的內容,而不適合用來規模化創建上

請注意,本文的步驟很多,只是我為了讓大家能了解更多細節。實際上沒有那麼複雜

在開始之前,請確定你安裝好了環境,如何安裝請看下面博客

dotnet 在 UOS 國產系統上安裝 MonoDevelop 開發工具

dotnet 在 UOS 國產系統上使用 MonoDevelop 創建 GTK 全平臺帶界面應用

dotnet 在 UOS 國產系統上使用 MonoDevelop 進行拖控制項開發 GTK 應用

如 dotnet 在 UOS 國產系統上使用 MonoDevelop 創建 GTK 全平臺帶界面應用 所說,創建一個空白的 GTK# 應用

接著創建一個控制臺項目,假定這個項目是 A 項目,這個控制臺項目將會添加 Xamarin.Foms 負載,然後將構建出基於 Xamarin.Forms 的界面 dll 文件,接著將由 GTK 項目,假定命名為 B 項目,作為最終原生控制項支持,被 Xamarin.Forms 的界面 dll 所映射,因此剛才新建的 GTK 項目就是最終入口項目,應用程式由他啟動

在創建的控制臺項目裡面,編輯 csproj 文件,右擊剛才創建的控制臺項目,點擊工具,點擊編輯文件

修改 csproj 文件為下面內容

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>portable</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="4.8.0.1364" />
<PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
</ItemGroup>
</Project>

有小夥伴說,在 Windows 下,用 VS 新建一個 Xamarin.Forms 項目之後,再拷貝到 UOS 上,也是可以的,但是有一點需要注意的是不能拷貝 bin 和  obj 文件夾過去,原因是在 obj 文件夾存放了很多依賴本機電腦的文件夾絕對路徑的文件,如 nuget 還原裡面的 project.assests.json 文件將會包含 fallback 路徑,如果拷貝到 Linux 下的系統,也許會看到如下提示

Error MSB4018 The "ResolvePackageAssets" task failed unexpectedly. NuGet.Packaging.Core.PackagingException: Unable to find fallback package folder 'C:\ProgramData\Xamarin\NuGet\'

或者

Error MSB4018 The "ResolvePackageAssets" task failed unexpectedly. NuGet.Packaging.Core.PackagingException: Unable to find fallback package folder 'C:\Program Files (x86)\Xamarin\NuGet\'

如果忘了這一點複製了 obj 文件夾,可以在 UOS 這個 Linux 系統下刪除 obj 文件夾,解決 Xamarin Forms 在 Linux 系統構建失敗的問題

先忽略從Windows等系統創建好了 Xamarin Forms 的方法,咱就在 UOS 上一步步創建

刪除 A 項目,也就是安裝了 Xamarin Forms 的控制臺項目,的 Program.cs 文件

然後選擇新建一個空 xml 文件,創建完成之後修改命名為 App.xaml 文件,同時創建一個空類叫 App.xaml.cs 文件

這兩個文件將表示 Xamarin Forms 項目的起始,也就是在 Xamarin 層的啟動入口。在使用 Xamarin.Forms 的 GTK 應用,有兩層入口,第一層是本機程序的入口,也就是 B 項目的 Program 文件的 Main 方法入口,第二層就是 Xamarin.Forms 的 App 入口。應用程式啟動的時候,先進入第一層入口,在第一層入口初始化本機相關的進程,然後進入第二層入口,在第二層入口初始化 Xamarin 應用

在 App.xaml 添加下面代碼,下面代碼的 x:Class="WokemhelurnawgelrallKearlallidallla.App" 其實 WokemhelurnawgelrallKearlallidallla 就是項目名

<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="WokemhelurnawgelrallKearlallidallla.App">
<Application.Resources>

</Application.Resources>
</Application>

其實上面的 App.xaml 是空代碼,有意義的代碼放在 App.xaml.cs 請看代碼

using Xamarin.Forms;

namespace WokemhelurnawgelrallKearlallidallla
{
public partial class App : Application
{
public App()
{
InitializeComponent();

MainPage = new MainPage();
}
}
}

上面代碼的核心就是在構造方法調用 InitializeComponent 方法,然後設置主頁面

接著咱需要新建一個主界面,新建 MainPage 的 xml 文件,然後修改命名為 MainPage.xaml 文件

然後填寫界面代碼

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="WokemhelurnawgelrallKearlallidallla.MainPage">

<StackLayout>
<Label Text="Welcome to Xamarin.Forms!"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
</StackLayout>

</ContentPage>

還請小夥伴先不要改多內容哈

接著新建 MainPage.xaml.cs 文件,添加下面代碼

using System.ComponentModel;
using Xamarin.Forms;

namespace WokemhelurnawgelrallKearlallidallla
{
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
}
}

現在新建了 App 應用和 MainPage 一個界面,但是還需要一個 AssemblyInfo.cs 文件,設置程序集特性

using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]

這樣一個簡單的 Xamarin Forms 項目就完成了,設置 GTK 項目,也就是 B 項目,引用 Xamarin Forms 項目,也就是 A 項目

但是此時將會發現構建不通過,因為 B 項目,也就是 GTK 項目沒有引用足夠的 NuGet 包。給 B 項目添加以下 NuGet 庫

接著打開 B 項目的 Program.cs 文件,在 Main 方法添加如下代碼

Gtk.Application.Init();
Forms.Init();

var app = new App();
var window = new FormsWindow();
window.LoadApplication(app);
window.SetApplicationTitle("lindexi");
window.Show();
Gtk.Application.Run();

注意在編輯器裡面添加 using 引用

然後刪除除了 Program.cs 的其他 cs 代碼文件

此時 B 項目,構建之後可以看到如下界面

當前的項目大概如下

本文沒有給大家一個簡單的方法,主要是讓大家可以了解更多內容

官方文檔請看 GTK# Platform Setup - Xamarin

儘管官方文檔裡面說的是預覽版,但是經過了2年的開發,現在不能的支持的點很少。另外,這裡的 GTK 支持的代碼都是完全開源的,剛好我改的動,所以用起來也不慌

相關焦點

  • Xamarin.Forms Android真機使用ChatKit快速搭建即時聊天界面(更新依賴AndroidX)
    Xamarin項目Android端安裝安卓nuget包Install-Package XamarinLibrary.Xamarin.Android.ChatKit -Version 0.3.32.參考原作者Android原生源碼用法對照調用C#相應函數;3.在Xamarin方面將ChatKit相關控制項使用
  • Xamarin 學習筆記 - 配置環境(Windows & iOS)
    因此,Xamarin是開始開發跨平臺應用程式的解決方案,它為你提供了本機代碼輸出的iOS,Android甚至是UWP的流暢用戶界面。通過使用Xamarin.Forms,用戶UI界面通過一個統一的框架,也就是XAML,可以同時用於三種不同的平臺。可以想像,如果我們能夠針對三種截然不同的平臺可以對發布的應用程式進行最大程度的代碼共享,這將是一件非常酷的事情。
  • 偽國產UOS與Deepin到底有什麼關係?
    1月14日,統信軟體宣布國產系統UOS統一OS正式發布,首先推出的是面向合作夥伴的版本。很多之前試用過UOS的玩家都知道,UOS實際上就是以武漢深度的Deepin系統為基礎開發的,那這兩者之間有什麼區別呢?
  • 國產還是套殼?最詳細的「國產」作業系統UOS安裝教程,附應用商店切換教程
    前不久,國內 UOS 統一作業系統官網上線,並發布了 UOS 對外測試和開放計劃。對於終於有了國產作業系統這件事,每一個國民當然是非常欣喜的,那麼這款作業系統究竟好不好用?能不能代替 Windows 成為主流?這更是每一個國民所關心的。
  • 在GTK+中使用CSS定製軟體外觀
    但是最近又有新的消息,以下翻譯作者原話: 最近,我一直在斷斷續續的開發gtk-style-context分支,這是一個用於代替GtkStyle,旨在為開發者擺脫在創建軟體界面時的局限性。
  • 國產統一作業系統UOS上手體驗
    [PConline 應用]近一段時間,Win10的更新搞得人心惶惶,新功能沒見多少,問題卻此起彼伏。常常是一個舊Bug搞定了,又帶來一堆新Bug。近日,中興新支點、深度、中國電子集團、誠邁科技等四家國產作業系統廠商,合力推出了一款統一作業系統(UOS),用來打破國外作業系統的壟斷壁壘。
  • dotnet cli 5.0 新特性——dotnet tool search
    dotnet cli 5.0 新特性——dotnet tool searchIntro.NET 5.0
  • 統信UOS 個人體驗版正式發布,附永久授權碼激活方式
    特有的時尚模式和高效模式兩種桌面風格,提供白色和黑色主題,適應不同用戶使用習慣,為您帶來舒適、流暢、愉悅的使用體驗。下面是官方介紹的激活方法:兩種方式啟動授權管理應用方式一、系統託盤圖標進入用戶狀態為[未激活],點擊右下角託盤上的"U"進入界面
  • 國產桌面UOS新版發布,新增三大功能
    與上一版本相比,新版統一了觸控屏、觸摸板、快捷鍵的交互規則,多款自研應用都與之兼容,同時文件管理器新增全文檢索功能,藍牙新增文件傳輸,計算器新增科學計算,自研的相機、磁碟管理器、安全中心、郵件客戶端等實用應用全新上線。 性能方面,新版優化了內核的代碼和配置,優化了啟動時間、安裝時間、資源佔用、操作響應等。
  • UOS官網上線:國產Windows系統能否雄起?
    上個月的14號,被稱為「國產Windows」的UOS 20正式版終於發布,這意味著國產系統又將迎來一位富有競爭力的新成員。而在近日,UOS的官網也正式上線。UOS的最終命名為「統一作業系統」,這是由統信軟體開發的一款基於Linux內核的作業系統,分為統一桌面作業系統和統一伺服器作業系統。一桌面應用場景為主,支持包括龍芯、鯤鵬等國產晶片的筆記本、臺式機、一體機和工作站以及伺服器等場景,其整體面向的群體以及競爭能力其實十分明顯。
  • 研究人員創建易於使用的數學感知搜索界面
    RIT教職員工團隊和學生研究人員創建了MathDeck,這是一種數學感知的搜索界面,可在計算機上使複雜的數學更加用戶友好。圖片來源:羅切斯特理工學院羅徹斯特理工學院的研究人員開發了MathDeck,這是一個在線搜索界面,任何人都可以在計算機上輕鬆創建,編輯和查找複雜的數學公式。MathDeck由十多名教師和學生組成的跨學科團隊創建,旨在使數學符號交互性強並且易於共享,而不是妨礙數學學習和探索。面向數學的搜索界面對公眾免費,可在mathdeck.cs.rit.edu上使用。
  • 原來國產深度系統有這些「缺陷」,難怪只有少數人在使用!
    相信大家或多或少都聽說過USO統一作業系統,一款可以支持多款國產晶片的國產作業系統。該系統從公布直至到現在,它一直保持著非常高的關注度。但是,有些用戶認為該系統只不是Deepin換了殼而已。從系統界面來看,UOS和Deepin的確非常相似。
  • Blazor教程: 創建一個簡單的TodoList應用
    ,特別是創建不同的部署模型,應用是如何配置和啟用的, 如果您對這些概念還不是很清楚,建議您通過如下的文章複習一下。(基於Blazor Server部署)深入理解Blazor Server技術Blazor和PWA讓桌面、安卓&iOS App開發多了一個選擇和可能 今天我們使用基於BlazorServer的部署模型創建一個簡單的TodoList應用,雖然這個應用非常簡單,但是基本包含了Blazor應用開發的很多要點:
  • Github上優秀的.NET Core項目
    NetMQ.ReactiveExtensions - 使用Reactive Extensions(RX)輕鬆地在網絡上的任何位置發送消息。傳輸協議是ZeroMQ。Optional - Optional類型庫.reactive-streams-dotnet - Reactive庫。
  • WPF漂亮界面框架實現原理分析及源碼分享
    這些插件的功能組合關係如下所示,"應用 = 界面框架插件 + 功能插件(演示/權限管理/插件中心插件)擴展"。界面框架定義了系統主界面風格、可擴展的屬性導航欄、可擴展的內容區域等元素構成。當主程序獲取到權限管理註冊的登錄窗體實例,便獲取該窗體並展現它,此後應用系統便交由插件來控制了。在權限管理插件的登錄窗體,它由LoginUserControl.xaml來實現,在該頁面的後臺代碼的登錄處理函數中,一旦登錄成功,它將創建一個主窗體MainWindow,並且顯示該窗體,如下圖所示。
  • 惠普國產臺式機,搭載國產處理器、中文版系統界面,真是太厲害了
    最近這段時間,惠普廠商正式推出國產臺式機——HP 268 Pro G1。根據小編了解,這款產品第一次採用我國所自主開發的國產——兆芯開先E系列處理器,還搭載了純中文版的系統BIOS界面,並且還預裝了神州網信政府版作業系統,主要是供給面向中國企業級用戶進行使用的。讓我們跟隨小編來看看他的核心配置方面吧。
  • 首款國產中望CAD Linux登陸統一作業系統UOS
    IT之家1月6日消息 近日,國產中望CAD Linux預裝版成功登陸統一作業系統UOS,中望CAD Linux預裝版是我國第一款基於Linux系統環境的國產CAD產品,自主核心技術填補了市場空白。目前,中望CAD Linux預裝版已全面適配統一作業系統UOS。為更好地滿足行業用戶的使用需求,中望軟體還基於不同CPU架構提供多種中望CAD適配方案,現階段可與鯤鵬、兆芯、龍芯、飛騰等主流晶片相適配。
  • 國產電腦系統已能滿足日常使用,專家評價:氣沖斗牛
    在中國windows作業系統的份額更加驚人,根據2014年的市場調研機構StatCounter調查數據顯示,Windows系統在中國市場中高達97%的市場份額。這充分說明了我國的電腦系統領域對於微軟的依賴程度是如此之高,那麼可能大多數網友都有疑問,我們到底能不能有一個國產的系統呢?
  • 微軟突然宣布,華為電腦被斷供Windows,只能使用國產系統
    相信大家都知道華為手機已經不能使用谷歌GMS服務,由於谷歌已經退出國內市場,因此國內的安卓手機用戶感覺不到有什麼不一樣,但對於國外安卓用戶來說影響就非常大,得不到谷歌授權GMS就意味著安卓手機不能訪問谷歌paly,而這些用戶離不開谷歌play商店的應用,好在有第三方平臺可以讓華為手機用戶以另一種形式下載谷歌play中的應用程式。
  • 國產系統怎麼樣?以普通用戶的視覺來看:Deepin OS深度系統
    其實基於liunx的國產系統已經有很多個了。比如:紅旗、起點、深度(Deepin)、中標麒麟(NeoKylin)、優麒麟(UbuntuKylin)。#deepin國產作業系統#我們普通老百姓,大都使用的都是windows系統,windows系統無論是軟體還是硬體的適配方面都有無法替代的優勢。但是假如有一天,我們不能使用windows系統了。那國產系統我們能用嗎?