在 Xamarin.Forms 快速入門中,生成了 Phoneword 應用程式。 本文回顧生成的内容,以深入了解有關 Xamarin.Forms 應用程式工作原理的基礎知識。
探讨了以下主題:
- Visual Studio 簡介 - Visual Studio 以及建立新 Xamarin.Forms 應用程式的簡介。
- Xamarin.Forms 應用程式剖析 - Xamarin.Forms 應用程式基本部分的教程。
- 體系結構和應用程式基礎知識 - 每個平台啟動應用程式的方式。
- 使用者界面 (UI) - 建立 Xamarin.Forms 的使用者界面。
- Phoneword 中引入的其他概念 - 簡單介紹 Phoneword 應用程式使用的其他概念。
- 測試和部署 - 完成應用程式,并提供有關測試、部署、生成圖稿等方面的建議。
Visual Studio 簡介
Visual Studio 是 Microsoft 提供的強大 IDE。 它采用完全內建的可視化設計器、包含重構工具的文本編輯器、程式集浏覽器、源代碼內建等。 本文重點介紹如何通過 Xamarin 插件使用 Visual Studio 的一些基本功能。
Visual Studio 将代碼組織為解決方案和項目。 解決方案是可以容納一個或多個項目的容器。 項目可以是應用程式、支援庫、測試應用程式等。 Phoneword 應用程式包含 1 個内附 6 個項目的解決方案,如以下螢幕截圖所示。
這些項目如下:
- Phoneword - 此項目是可移植類庫 (PCL) 項目,其中包含所有共享代碼和共享 UI。
- Phoneword.Droid - 此項目包含 Android 特定代碼,是 Android 應用程式的入口點。
- Phoneword.iOS - 此項目包含 iOS 特定代碼,是 iOS 應用程式的入口點。
- Phoneword.UWP - 此項目包含通用 Windows 平台特定代碼,是 UWP 應用程式的入口點。
- Phoneword.WinPhone - 此項目包含 Windows Phone 特定代碼,是 Windows Phone 8.0 應用程式的入口點。
- Phoneword.WinPhone81 - 此項目包含 Windows Phone 8.1 特定代碼,是 Windows Phone 8.1 應用程式的入口點。
Xamarin.Forms 應用程式剖析
以下螢幕截圖顯示 Visual Studio 中 Phoneword PCL 項目的内容:
項目包含 2 個檔案夾:
- 引用 - 包含生成和運作應用程式所需的程式集。
- 屬性 - 包含 .NET 程式集中繼資料檔案 AssemblyInfo.cs。 最好在此檔案中填寫一些應用程式相關的基本資訊。 有關此檔案的詳細資訊,請參閱 MSDN 上的 AssemblyInfo 類。
項目還包括多個檔案:
- App.xaml -
類的 XAML 标記,該類定義應用程式的資源字典。App
- App.xaml.cs -
類的代碼隐藏,該類負責執行個體化應用程式在每個平台上将顯示的首頁,并處理應用程式生命周期事件。App
- IDialer.cs< -
接口,該接口指定IDialer
方法必須由任何實作類提供。Dial
- MainPage.xaml -
類的 XAML 标記,該類定義應用程式啟動時所顯示頁的 UI。MainPage
- MainPage.xaml.cs -
類的代碼隐藏,該類包含使用者與頁面互動時執行的業務邏輯。MainPage
- packages.config - XML 檔案,其中包含項目所使用 NuGet 包的相關資訊,以便跟蹤所需包及各自的版本。 Xamarin Studio 和 Visual Studio 均可配置為:與其他使用者共享源代碼時,自動還原任何缺少的 NuGet 包。 此檔案的内容由 NuGet 包管理器控制,且不可手動編輯。
- PhoneTranslator.cs - 負責将電話文字轉換為電話号碼的業務邏輯,此邏輯從 MainPage.xaml.cs 調用。
有關 Xamarin.iOS 應用程式剖析的詳細資訊,請參閱 Xamarin.iOS 應用程式剖析。 有關 Xamarin.Android 應用程式剖析的詳細資訊,請參閱 Xamarin Android 應用程式剖析。
體系結構和應用程式基礎知識
Xamarin.Forms 應用程式采用與傳統跨平台應用程式相同的建構方式。 共享代碼通常位于可移植類庫 (PCL) 中,平台特定應用程式使用此共享代碼。 下圖概要示範了 Phoneword 應用程式的這種關系:
有關 PCL的詳細資訊,請參閱可移植類庫簡介。
若要最大限度重用啟動代碼,Xamarin.Forms 應用程式需有一個名為
App
的單個類,該類負責執行個體化應用程式在每個平台上将顯示的首頁,如以下代碼示例所示:
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Phoneword
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
...
}
}
此代碼将
App
類的
MainPage
屬性設定為
MainPage
類的一個新執行個體。 此外,
XamlCompilation
屬性可打開 XAML 編譯器,以使 XAML 直接編譯為中間語言。 有關詳細資訊,請參閱 XAML 編譯。
在每個平台上啟動應用程式
iOS
若要在 iOS 中啟動 Xamarin.Forms 初始頁面,Phoneword.iOS 項目應包括繼承自
FormsApplicationDelegate
類的
AppDelegate
類,如以下代碼示例所示:
namespace Phoneword.iOS
{
[Register ("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
LoadApplication (new App ());
return base.FinishedLaunching (app, options);
}
}
}
通過調用
Init
方法,
FinishedLaunching
替代初始化 Xamarin.Forms 架構。 這會導緻在調用将根視圖控制器設定為
LoadApplication
方法之前,将特定于 iOS 的 Xamarin.Forms 實作加載到應用程式。
Android
若要在 Android 中啟動 Xamarin.Forms 初始頁面,Phoneword.Droid 項目應包括使用
MainLauncher
屬性建立活動的代碼,以及繼承自
FormsApplicationActivity
類的活動,如以下代碼示例所示:
namespace Phoneword.Droid
{
[Activity (Label = "Phoneword.Droid",
Icon = "@drawable/icon",
MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
}
}
}
通過調用
Init
方法,
OnCreate
替代初始化 Xamarin.Forms 架構。 這會導緻在加載 Xamarin.Forms 應用程式之前,将特定于 Android 的 Xamarin.Forms 實作加載到應用程式。
通用 Windows 平台
在通用 Windows 平台 (UWP) 應用程式中,可從
App
類調用初始化 Xamarin.Forms 架構的
Init
方法:
Xamarin.Forms.Forms.Init (e);
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
...
}
這會将特定于 UWP 的 Xamarin.Forms 實作加載到應用程式。 可通過
MainPage
類啟動 Xamarin.Forms 初始頁面,如以下代碼示例所示:
namespace Phoneword.UWP
{
public sealed partial class MainPage
{
public MainPage()
{
this.InitializeComponent();
this.LoadApplication(new Phoneword.App());
}
}
}
可通過
LoadApplication
方法加載 Xamarin.Forms 應用程式。
使用者界面
可使用 4 個主要控件組建立 Xamarin.Forms 應用程式的使用者界面。
- 頁面 - Xamarin.Forms 頁呈現跨平台移動應用程式螢幕。 Phoneword 應用程式使用
類顯示單個螢幕。 有關頁面的詳細資訊,請參閱 Xamarin.Forms 頁面。ContentPage
- 布局 - Xamarin.Forms 布局是用于将視圖組合到邏輯結構的容器。 Phoneword 應用程式使用
類以水準堆疊方式排列控件。 有關布局的詳細資訊,請參閱 Xamarin.Forms 布局。StackLayout
- 視圖 - Xamarin.Forms 視圖是顯示在使用者界面上的控件,如标簽、按鈕和文本輸入框。 Phoneword 應用程式使用
、Label
和Entry
控件。 有關視圖的詳細資訊,請參閱 Xamarin.Forms 視圖。Button
- 單元格 - Xamarin.Forms 單元格是專門用于清單中的項的元素,描述清單中每個項的繪制方式。 Phoneword 應用程式不會使用任何單元格。 有關單元格的詳細資訊,請參閱 Xamarin.Forms 單元格。
在運作時,每個控件都會映射到其本身的本機等效項(即呈現的内容)。
在任一平台運作 Phoneword 應用程式時,此應用會顯示對應于 Xamarin.Forms 中
Page
的單一螢幕。
Page
在 Android 中表示為一個 ViewGroup,在 iOS 中表示為視圖控制器,在 Windows 通用平台中則表示為一個頁面。 Phoneword 應用程式也會執行個體化表示
MainPage
類的
ContentPage
對象,該類的 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"
x:Class="Phoneword.MainPage">
...
<ContentPage.Content>
<StackLayout VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand"
Orientation="Vertical"
Spacing="15">
<Label Text="Enter a Phoneword:" />
<Entry x:Name="phoneNumberText" Text="1-855-XAMARIN" />
<Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
<Button x:Name="callButton" Text="Call" IsEnabled="false" Clicked="OnCall" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
MainPage
類使用
StackLayout
控件在螢幕上自動排列控件,而不考慮螢幕大小。 根據添加順序,以垂直方式逐個放置每個子元素。
StackLayout
占用的螢幕空間大小取決于
HorizontalOptions
的值和
VerticalOptions
屬性。 在此情況下,
FillAndExpand
值訓示
StackLayout
本身未進行填充,但進行了擴充。
StackLayout
控件包含 1 個用于在頁面上顯示文本的
Label
控件、1 個用于接收文本使用者輸入的
Entry
控件和 2 個用于在響應觸摸事件時執行代碼的
Button
控件。
有關 Xamarin.Forms 中 XAML 的詳細資訊,請參閱 Xamarin.Forms XAML 基礎知識。
響應使用者互動
XAML 中定義的對象可觸發在隐藏檔案中處理的事件。 以下代碼示例示範了
MainPage
類的代碼隐藏中的
OnTranslate
方法,該類在響應
Clicked
事件觸發“轉換”按鈕時執行。
void OnTranslate(object sender, EventArgs e)
{
translatedNumber = Core.PhonewordTranslator.ToNumber (phoneNumberText.Text);
if (!string.IsNullOrWhiteSpace (translatedNumber)) {
callButton.IsEnabled = true;
callButton.Text = "Call " + translatedNumber;
} else {
callButton.IsEnabled = false;
callButton.Text = "Call";
}
}
OnTranslate
方法将 phoneword 轉換為其相應的電話号碼,并在響應時設定調用按鈕上的屬性。 XAML 類的代碼隐藏檔案可使用為其配置設定的、具有
x:Name
屬性的名稱通路 XAML 中定義的對象。 配置設定給此屬性的值與 C# 變量的規則相同,因為該值必須以字母或下劃線開頭,且不包含嵌入的空格。
對
OnTranslate
方法的切換按鈕布線會在
MainPage
類的 XAML 标記中出現:
<Button x:Name="translateButon" Text="Translate" Clicked="OnTranslate" />
Phoneword 中引入的其他概念
用于 Xamarin.Forms 的 Phoneword 應用程式引入了多個本文未提及的概念。 這些概念包括:
- 啟用和禁用按鈕。 通過更改
的Button
屬性,可将其打開或關閉。 例如,以下代碼示例禁用IsEnabled
:callButton
callButton.IsEnabled = false;
- 顯示警報對話框。 使用者按呼叫按鈕時,Phoneword 應用程式會顯示“警報”對話框,其中包含發出或取消呼叫的選項。
方法用于建立該對話框,如以下代碼示例所示:DisplayAlert
await this.DisplayAlert ( "Dial a Number", "Would you like to call " + translatedNumber + "?", "Yes", "No");
- 通過
類通路本機功能。 Phoneword 應用程式使用DependencyService
類将DependencyService
接口解析到特定于平台的電話撥号實作中,如以下 Phoneword 項目中的代碼示例所示:IDialer
有關async void OnCall (object sender, EventArgs e) { ... var dialer = DependencyService.Get<IDialer> (); ... }
類的詳細資訊,請參閱通過 DependencyService 通路本機功能。DependencyService
- 通過 URL 發出電話呼叫。 Phoneword 應用程式使用
啟動系統電話應用。 URL 包含OpenURL
字首,後跟要呼叫的電話号碼,如以下 iOS 項目中的代碼示例所示:tel:
return UIApplication.SharedApplication.OpenUrl (new NSUrl ("tel:" + number));
- 調整平台布局。 使用
類,開發人員能夠根據每個平台自定義應用程式布局和功能,如以下代碼示例所示(此示例使用 iOS 上的另一個Device
值正确顯示每一頁):Padding
有關平台調整的詳細資訊,請參閱裝置類。<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" ...> <ContentPage.Padding> <OnPlatform x:TypeArguments="Thickness" iOS="20, 40, 20, 20" ... /> </ContentPage.Padding> ... </ContentPage>
測試和部署
Xamarin Studio 和 Visual Studio 均提供許多用于測試和部署應用程式的選項。 調試應用程式是應用程式開發生命周期的普遍一環,有助于診斷代碼問題。 有關詳細資訊,請參閱設定斷點、逐漸執行代碼和日志視窗的輸出資訊。
模拟器是開始部署和測試應用程式的有利位置,其提供用于測試應用程式的有用功能。 但是,使用者不會在模拟器中使用最終應用程式,是以應盡早并經常在實際裝置上測試應用程式。 有關 iOS 裝置預配的詳細資訊,請參閱裝置預配。 有關 Android 裝置預配的詳細資訊,請參閱設定裝置進行開發。
摘要
本文介紹了使用 Xamarin.Forms 開發應用程式的基礎知識。 涵蓋的主題包括:Xamarin.Forms 應用程式剖析、體系結構和應用程式基礎知識以及使用者界面。
在本指南的下一部分,将介紹如何擴充應用程式以包含多個螢幕,進而探索更進階的 Xamarin.Forms 體系結構和概念。