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

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

本文將使用特別底層的方法告訴你們如何一步步建立,而不是告訴你們如何在 IDE 上進行快速的建立。所以本文更適合用來告訴你們一些基礎的內容,而不適合用來規模化建立上json

請注意,本文的步驟不少,只是我爲了讓你們能瞭解更多細節。實際上沒有那麼複雜windows

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

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

接着建立一個控制檯項目,假定這個項目是 A 項目,這個控制檯項目將會添加 Xamarin.Foms 負載,而後將構建出基於 Xamarin.Forms 的界面 dll 文件,接着將由 GTK 項目,假定命名爲 B 項目,做爲最終原生控件支持,被 Xamarin.Forms 的界面 dll 所映射,所以剛纔新建的 GTK 項目就是最終入口項目,應用程序由他啓動工具

在建立的控制檯項目裏面,編輯 csproj 文件,右擊剛纔建立的控制檯項目,點擊工具,點擊編輯文件post

修改 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 上,也是能夠的,可是有一點須要注意的是不能拷貝 binobj 文件夾過去,緣由是在 obj 文件夾存放了不少依賴本機電腦的文件夾絕對路徑的文件,如 nuget 還原裏面的 project.assests.json 文件將會包含 fallback 路徑,若是拷貝到 Linux 下的系統,也許會看到以下提示spa

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

或者.net

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 ),不得用於商業目的,基於本文修改後的做品務必以相同的許可發佈。若有任何疑問,請與我聯繫

相關文章
相關標籤/搜索