Xamarin.Forms 應用程式類別

Application 基底類別提供下列功能,它們公開於您專案的預設 App 子類別:

  • MainPage 屬性,這是要設定應用程式起始頁的位置。
  • 持續性的 Properties 字典,用來跨生命週期狀態變更來儲存簡單值。
  • 靜態的 Current 屬性,其中包含目前應用程式物件的參考。

它也會公開生命週期方法,例如 OnStartOnSleepOnResume,以及強制回應巡覽事件。

根據您選擇的範本,App 類別可以用兩種方式之一來定義:

  • C#
  • XAML & C#

若要使用 XAML 建立 App 類別,預設的 App 類別必須取代為 XAML App 類別和相關聯的程式碼後置,如下列程式碼範例所示:

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Photos.App">

</Application>

下列程式碼範例顯示相關聯的 程式碼後置:

public partial class App : Application
{
    public App ()
    {
        InitializeComponent ();
        MainPage = new HomePage ();
    }
    ...
}

除了設定 MainPage 屬性之外,程式碼後置還必須呼叫 InitializeComponent 方法來載入及剖析相關聯的 XAML。

MainPage 屬性

Application 類別的 MainPage 屬性會設定應用程式的根頁面。

比方說,您可以在 App 類別中建立邏輯,以視使用者登入與否顯示不同的頁面。

MainPage 屬性應該設定於 App 建構函式中,

public class App : Xamarin.Forms.Application
{
    public App ()
    {
        MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
    }
}

Properties 字典

Application 子類別有靜態的 Properties 字典可以用來儲存資料,特別是用於 OnStartOnSleepOnResume 方法。 您可以使用 從程式 Xamarin.Forms 代碼中的任何位置存取此專案 Application.Current.Properties

Properties 字典使用 string 索引鍵並儲存 object 值。

例如,您可以在程式碼中的任何位置設定持續性的 "id" 屬性 (項目選取時,在頁面的 OnDisappearing 方法,或在 OnSleep 方法中) 如下所示:

Application.Current.Properties ["id"] = someClass.ID;

OnStartOnResume 方法中,您便可以使用此值,以某種方式重新建立使用者的體驗。 Properties 字典會儲存 object,因此您需要先轉換其值才能使用。

if (Application.Current.Properties.ContainsKey("id"))
{
    var id = Application.Current.Properties ["id"] as int;
    // do something with id
}

請務必先檢查索引鍵是否存在才存取它,以避免發生意外的錯誤。

注意

Properties 字典只可序列化基本類型以便儲存。 嘗試儲存其他類型 (例如 List<string>) 可能會以無訊息模式失敗。

持續性

Properties 字典會自動儲存至裝置。 新增至字典的資料將在應用程式從背景返回時可用,或甚至在它重新啟動之後才可使用。

Xamarin.Forms 1.4 在 類別上 Application 引進了額外的方法 - SavePropertiesAsync() 可呼叫以主動保存 Properties 字典。 這樣可讓您在重要更新之後儲存屬性,而不必冒著它們因為損毀或被 OS 終止 OS 而未序列化的風險。

您可以在建立行動應用程式與Xamarin.Forms書籍中找到使用Properties字典的參考(請參閱章節 6、15 和 20),以及相關聯的範例。

應用程式類別

完整的 Application 類別實作顯示如下供您參考:

public class App : Xamarin.Forms.Application
{
    public App ()
    {
        MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
    }

    protected override void OnStart()
    {
        // Handle when your app starts
        Debug.WriteLine ("OnStart");
    }

    protected override void OnSleep()
    {
        // Handle when your app sleeps
        Debug.WriteLine ("OnSleep");
    }

    protected override void OnResume()
    {
        // Handle when your app resumes
        Debug.WriteLine ("OnResume");
    }
}

這個類別接著便會在每個平台特定專案中具現化,並傳遞至 LoadApplication 方法,在這裡會載入 MainPage 並顯示給使用者。 每個平台的程式碼顯示在下列各節。 最新的 Xamarin.Forms 解決方案範本已經包含所有此程式碼,已針對您的應用程式預先設定。

iOS 專案

iOS AppDelegate 類別繼承自 FormsApplicationDelegate。 它應該:

  • 使用 App 類別的執行個體呼叫 LoadApplication

  • 一律傳回 base.FinishedLaunching (app, options);

[Register ("AppDelegate")]
public partial class AppDelegate :
    global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate // superclass new in 1.3
{
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init ();

        LoadApplication (new App ());  // method is new in 1.3

        return base.FinishedLaunching (app, options);
    }
}

Android 專案

Android MainActivity 繼承自 FormsAppCompatActivity。 在 OnCreate 覆寫中,使用 App 類別的執行個體呼叫 LoadApplication 方法。

[Activity (Label = "App Lifecycle Sample", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true,
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        global::Xamarin.Forms.Forms.Init (this, bundle);

        LoadApplication (new App ()); // method is new in 1.3
    }
}

適用於 Windows 10 的通用 Windows 平台 (UWP)

在 UWP 專案中的主頁面應該繼承自 WindowsPage

<forms:WindowsPage
   ...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
   ...>
</forms:WindowsPage>

建構背後的 C# 程式代碼必須呼叫 LoadApplication ,才能建立 的 Xamarin.FormsApp實例。 請注意,最好明確地使用應用程式命名空間來限定 ,App因為 UWP 應用程式也有與其無關Xamarin.Forms的類別App

public sealed partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();

        LoadApplication(new YOUR_NAMESPACE.App());
    }
 }

請注意,必須從 UWP 專案中的 App.xaml.cs 呼叫 Forms.Init()

如需詳細資訊,請參閱 設定 Windows 專案,其中包含將 UWP 專案新增至未以 UWP 為目標的現有 Xamarin.Forms 解決方案的步驟。

Channel 9YouTube 上尋找更多 Xamarin 影片。