在 Visual Studio 中建立 Xamarin.Forms 專案
最常用於行動應用程式開發的模式是開發兩次。 一次用於 Android,一次用於 iOS。 這不僅牽涉到處理個別的 SDK,還牽涉到全然不同的語言和工具組。
Xamarin.Forms 可讓您在一個整合式開發環境中以一種語言進行工作。 您只需建立 UI 一次,iOS 和 Android 便都可使用該 UI 定義,包括您所撰寫的動作和事件程式碼。 與一些其他跨平台解決方案不同,Xamarin.Forms 不會在 Web 檢視中轉譯。 取而代之的是,它會在內部使用 Android SDK 或 iOS SDK 來建立原生控制項,以獲得原生效能。
在本單元中,我們將了解 Xamarin.Forms 如何運作,以及如何組建專案結構,讓我們只需撰寫程式碼和 UI 定義一次,即可在多個平台上執行。
什麼是 Xamarin.Forms 技術堆疊?
Xamarin.Forms 非常容易使用,但為了了解它如何管理其所作所為,讓我們看看其中涉及的技術。
作業系統
就像在幾乎任何類型的系統上執行的每一個軟體一樣,為行動裝置撰寫的程式也是在作業系統上執行。 作業系統提供數個服務,包括存取記憶體和 CPU 等重要資源。
您可以撰寫一個程式,其中您只會取用直接來自作業系統的服務。 不過,以這種方式打造行動應用程式不尋常。 這意謂著使用 C (可能甚至是組件) 來建置您的整個應用程式。
平台 SDK
平台為我們提供建置在稱為 SDK (軟體開發套件) 之作業系統上的更高層級抽象概念。 SDK 提供大多數開發人員用來建置應用程式的所有常見工具。 這些包括按鈕和文字輸入欄位等視覺效果,以及網路功能和語音辨識等服務。 Java、Kotlin 及 Swift 等常見的行動開發語言都是以平台 SDK 為目標。
Xamarin.iOS 和 Xamarin.Android
下一層是第一個 Xamarin 層。 Xamarin.Android 和 Xamarin.iOS 可讓 C# 存取所有這些平台 SDK 及作業系統服務。 例如,您可以使用 C# 來存取 java.lang.string 物件或 Android 文字輸入。 這同樣適用於 iOS 類型。
Xamarin.Android 和 Xamarin.iOS 也提供我們 .NET。 包括執行階段和「基底類別庫」(BCL)。 這是可供我們找到 List<T>、HttpClient、System.String 等的項目。 .NET 開發人員所慣用的所有類型。
Xamarin 也讓大多數平台類型能夠與 .NET BCL 類型順暢地互動。 例如,我可以指派一個要由 iOS UILabel 顯示的 .NET System.String,而它便能運作。
直接使用 Xamarin.iOS 和 Xamarin.Android 來打造行動應用程式是一個熱門選擇。 這可能是一個絕佳選項,可讓我們的 Android 和 iOS 應用程式共用某些邏輯。 不過,我們仍然必須個別為每個平台打造使用者介面。 例如,如果我們想要一個有按鈕的畫面,在 Xamarin.Android 專案中,我們將必須建立 android.widget.button,而在 Xamarin.iOS 專案中,則會建立 UIButton。
Xamarin.Forms
如果我們想要只定義 UI 和 UI 行為一次,就是 Xamarin.Forms 派上用場的時候。
在 Xamarin.Forms 專案中,我們只會定義 UI 和事件處理常式程式碼一次,然後系統就會根據應用程式的執行平台解譯每個類型。 如果應用程式使用 Xamarin.Forms.Button
且我們在 iOS 上執行該應用程式,我們就會得到 iOS UIButton。 如果我們在 Android 上執行,則會得到 Android.Widget.Button
。 由於 Xamarin.Forms 一律使用內建的平台 SDK 類型,因此我們會獲得該類型所帶來的最佳效能。
提示
我們大多是談論就 iOS 和 Android 上的行動應用程式而言,Xamarin.Forms 能夠做些什麼。 Xamarin.Forms 程式碼也可以在 Windows 上透過「通用 Windows 平台」(UWP) 執行,以及在 Mac 和 Linux 桌上型電腦上執行。
Xamarin.Forms 提供什麼?
如我們所見,Xamarin.Forms 可讓存取按鈕等常見的控制項變得容易。 文字輸入欄位、標籤及日期選擇器等其他常見的控制項也同樣容易。 但個別控制項並不足以構成可建立豐富應用程式的絕佳平台。 Xamarin.Forms 也為我們提供:
- 一個用於設計頁面的詳盡版面配置引擎。
- 多個用於建立豐富瀏覽類型 (例如選單) 的頁面類型。
- 對適用於更簡潔且可維護之開發模式的 XAML 和資料繫結的支援。
您也可以透過數個方式擴充 Xamarin.Forms 功能:
- NuGet 套件可協助您在 Xamarin.Forms 應用程式中使用協力廠商及其他 Microsoft 程式庫。
- 原生控制項。 例如,當您的 Xamarin.Forms 應用程式在 Android 上執行時,它可能包含浮動的動作按鈕。 或者,在 iOS 上,則可能包含 UISegmentedControl。
- 自訂控制項。 您一律可以將自己的完全自訂控制項提供給 Xamarin.Forms 使用。 事實上,如果已經有 Android 和 iOS 的控制項存在,通常只需幾行程式碼,即可對 Xamarin.Forms 公開該控制項。
我們將在其他課程模組中更詳細討論原生和自訂控制項。
Xamarin.Essentials
核心 Xamarin.Forms 可讓使用者介面更易於管理。 但 Xamarin.Essentials 可處理與 UI「無關」的常見行動應用程式需求。 這意謂著在您新增 Xamarin.Essentials NuGet 套件之後,您便可以存取 GPS、加速計以及電池和網路狀態。 Xamarin.Essentials 可讓我們輕鬆存取行動開發常見的許多感應器和服務。
Visual Studio 適用於 Xamarin.Forms 應用程式的新專案範本全都自動包含 Xamarin.Essentials NuGet 套件。
如何開始使用
安裝 Visual Studio 和行動開發工作負載之後,我們便擁有開始建置行動應用程式所需的一切工具。 甚至免費的 Visual Studio Community Edition 也可運作。
若要從 Visual Studio 2019 建立新專案,請前往 [新增專案] 對話方塊,然後搜尋「行動」。 接著選取 [行動應用程式 (Xamarin.Forms)] 範本。 (我們將在第一次編碼練習期間確切地執行此動作)。接著,您會輸入新專案的名稱和位置。 下一個對話方塊會有幾個入門應用程式範本可供選擇。 選取 [空白],因為我們將新增自己的自訂瀏覽和頁面。 實際上,如同您將在我們的第一個練習中所見,即使是空白應用程式範本也隨附入門的 "Hello World" 類型頁面,因此並非完全空白。 這也是對話方塊,您將在其中挑選 Xamarin.Forms 應用程式支援的平台。
解決方案的結構看起來會像這樣:
在解決方案中建立了三個專案。 它們都具有相同的根名稱,但其中兩個有尾碼 (".iOS" 或 ".Android")。 這些專案會編譯成可執行的程式,每個平台各有一個程式。 這些有時稱為「前端專案」。 第三個專案是可執行檔使用的專案,也是我們將放置所有共同程式碼和標記的地方。 在典型的 Xamarin.Forms 解決方案中,幾乎我們的所有工作都會在這第三個專案中進行。
前端專案
進一步探究前端專案,我們可以看到 iOS 和 Android 具有不同的基本建構。 例如,iOS 有 Main.cs 和 AppDelegate.cs,但 Android 則有 MainActivity.cs。 它們不同的原因在於,iOS 專案的建構使用與任何 iOS 專案 (包括 Objective C 或 Swift 專案) 相同的建置組塊。 Android 專案則使用與 Java 或 Kotlin Android 專案相同的建置組塊。 基本上,這些專案只是使用 Xamarin.Android 的 Android 應用程式,以及使用 Xamarin.iOS 的 iOS 應用程式,將其 API 公開成 C# 類別。
The Android app, App1.Android, includes an Assets folder, Resources folder, and MainActivity.cs. The iOS app, App1.iOS, includes Asset Catalogs, Native References, Resources, AppDelegate.cs, and Entitlements.plist.
如果我們查看每個專案類型的主要進入點,就會看到每一個都將 Xamarin.Forms 初始化,並明確讓 Xamarin.Forms 應用程式能夠控制 UI 的建立方式。
在 iOS 中,我們會在 AppDelegate.cs 檔案的 FinishedLaunching 方法中看到此情況。
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
...
}
在 Android 中,其位於 MainActivity.cs 檔案的 OnCreate 方法中。
protected override void OnCreate(Bundle savedInstanceState)
{
...
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
提示
如果我們想要讓 Xamarin.Forms 專案在甚至更多的平台上執行,就會將更多前端專案新增至解決方案。 這些會有自己的方法來載入 Xamarin.Forms 及將其初始化。
對 LoadApplication()
的呼叫中具有對 new App()
的參考。 該 App
類別是我們的 Xamarin.Forms 應用程式。 那就是我們將為應用程式定義 UI 和行為的地方。
我們前端專案中的 [參考] 區段將會顯示每個前端專案皆參考通用專案。 前端專案和通用專案也會參考 Xamarin.Forms 程式庫。 這就是我們能夠使用 Xamarin.Forms 功能的方式。