天天看點

Xamarin.Forms 深度解析 Visual Studio 簡介 Xamarin.Forms 應用程式剖析 體系結構和應用程式基礎知識 在每個平台上啟動應用程式 通用 Windows 平台 使用者界面 Phoneword 中引入的其他概念 測試和部署 摘要

在 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 個項目的解決方案,如以下螢幕截圖所示。

Xamarin.Forms 深度解析 Visual Studio 簡介 Xamarin.Forms 應用程式剖析 體系結構和應用程式基礎知識 在每個平台上啟動應用程式 通用 Windows 平台 使用者界面 Phoneword 中引入的其他概念 測試和部署 摘要

這些項目如下:

  • 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 項目的内容:

Xamarin.Forms 深度解析 Visual Studio 簡介 Xamarin.Forms 應用程式剖析 體系結構和應用程式基礎知識 在每個平台上啟動應用程式 通用 Windows 平台 使用者界面 Phoneword 中引入的其他概念 測試和部署 摘要

項目包含 2 個檔案夾:

  • 引用 - 包含生成和運作應用程式所需的程式集。
  • 屬性 - 包含 .NET 程式集中繼資料檔案 AssemblyInfo.cs。 最好在此檔案中填寫一些應用程式相關的基本資訊。 有關此檔案的詳細資訊,請參閱 MSDN 上的 AssemblyInfo 類。

項目還包括多個檔案:

  • App.xaml - 

    App

     類的 XAML 标記,該類定義應用程式的資源字典。
  • App.xaml.cs - 

    App

     類的代碼隐藏,該類負責執行個體化應用程式在每個平台上将顯示的首頁,并處理應用程式生命周期事件。
  • IDialer.cs< - 

    IDialer

     接口,該接口指定 

    Dial

     方法必須由任何實作類提供。
  • MainPage.xaml - 

    MainPage

     類的 XAML 标記,該類定義應用程式啟動時所顯示頁的 UI。
  • 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 應用程式的這種關系:

Xamarin.Forms 深度解析 Visual Studio 簡介 Xamarin.Forms 應用程式剖析 體系結構和應用程式基礎知識 在每個平台上啟動應用程式 通用 Windows 平台 使用者界面 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 應用程式的使用者界面。

  1. 頁面 - Xamarin.Forms 頁呈現跨平台移動應用程式螢幕。 Phoneword 應用程式使用 

    ContentPage

     類顯示單個螢幕。 有關頁面的詳細資訊,請參閱 Xamarin.Forms 頁面。
  2. 布局 - Xamarin.Forms 布局是用于将視圖組合到邏輯結構的容器。 Phoneword 應用程式使用 

    StackLayout

     類以水準堆疊方式排列控件。 有關布局的詳細資訊,請參閱 Xamarin.Forms 布局。
  3. 視圖 - Xamarin.Forms 視圖是顯示在使用者界面上的控件,如标簽、按鈕和文本輸入框。 Phoneword 應用程式使用

    Label

    Entry

     和 

    Button

     控件。 有關視圖的詳細資訊,請參閱 Xamarin.Forms 視圖。
  4. 單元格 - 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");           
  • 通過 

    DependencyService

     類通路本機功能。 Phoneword 應用程式使用 

    DependencyService

     類将 

    IDialer

     接口解析到特定于平台的電話撥号實作中,如以下 Phoneword 項目中的代碼示例所示:
    async void OnCall (object sender, EventArgs e)
    {
        ...
        var dialer = DependencyService.Get<IDialer> ();
        ...
    }           
    有關 

    DependencyService

     類的詳細資訊,請參閱通過 DependencyService 通路本機功能。
  • 通過 URL 發出電話呼叫。 Phoneword 應用程式使用 

    OpenURL

     啟動系統電話應用。 URL 包含 

    tel:

     字首,後跟要呼叫的電話号碼,如以下 iOS 項目中的代碼示例所示:
    return UIApplication.SharedApplication.OpenUrl (new NSUrl ("tel:" + number));           
  • 調整平台布局。 使用 

    Device

     類,開發人員能夠根據每個平台自定義應用程式布局和功能,如以下代碼示例所示(此示例使用 iOS 上的另一個 

    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 體系結構和概念。

繼續閱讀