在前面幾篇博客告訴大家如何部署 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 庫
- OpenTK
- Xamarin.Forms
- Xamarin.Forms.Platform.GTK
接着打開 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 支持的代碼都是完全開源的,剛好我改的動,所以用起來也不慌
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改后的作品務必以相同的許可發布。如有任何疑問,請與我聯系。