Application 基类提供以下功能,这些功能在项目的默认 App 子类中公开:
- MainPage属性,可在其中设置应用的初始页面。
- 持久 Properties字典,用于跨生命周期状态更改存储简单值。
- 静态 Current属性,其中包含对当前应用程序对象的引用。
它还公开生命周期方法,例如 OnStart、OnSleep 和 OnResume 以及模式导航事件。
根据选择的模板,可以通过以下两种方式之一定义 App 类:
- C#,或
- XAML 和 C#
若要使用 XAML 创建 App 类,必须使用 XAML App 类和关联的代码隐藏替换默认的 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 类中创建逻辑,以便根据用户的登录状态来显示不同的页面。
应在 App 构造函数中设置 MainPage 属性。
public class App : Xamarin.Forms.Application
{
    public App ()
    {
        MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
    }
}
属性字典
Application 子类具有静态 Properties 字典,该字典可用于存储数据,特别是用于 OnStart、OnSleep 和 OnResume 方法。 可以使用 Application.Current.Properties 从 Xamarin.Forms 代码中的任何位置对此进行访问。
Properties 字典使用 string 密钥并存储 object 值。
例如,可以在代码中的任何位置(选中某个项目时,在页面的 OnDisappearing 方法中,或在 OnSleep 方法中)设置持久 "id" 属性,如下所示:
Application.Current.Properties ["id"] = someClass.ID;
在 OnStart 或 OnResume 方法中,随后可使用此值以某种方式重新创建用户体验。 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 终止而无法将这些属性序列化的风险。
可以在创建移动应用和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 并向用户显示。
以下各部分展示了每个平台的代码。 最新的 XXamarin.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 解决方案的步骤。