Xamarin.Forms 应用类
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 解决方案的步骤。