应用程序基类提供以下功能,这些功能在您的项目默认应用程序子类中公开:
- 一个MainPage属性,它是为应用程序设置初始页面的地方。
- 持久性属性字典,用于跨生命周期状态更改存储简单值。
- 包含对当前应用程序对象的引用的静态Current属性。
还暴露生命周期方法,如OnStart,OnSleep和OnResume以及模态导航事件。
根据您选择的模板,可以通过以下两种方式之一来定义App类:
- C#,或者
- XAML & C#
要使用XAML创建应用程序类,默认应用程序类必须替换为XAML应用程序类和关联的代码隐藏,如以下代码示例所示:
点击(此处)折叠或打开
- 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属性
Application类的MainPage属性设置应用程序的根页面。
例如,您可以在App类中创建逻辑,以根据用户是否登录来显示不同的页面。
MainPage属性应该在App构造函数中设置,
点击(此处)折叠或打开
- public class App : Xamarin.Forms.Application
- {
- public App ()
- {
- MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
- }
- }
属性字典
Application子类具有一个静态属性字典,可用于存储数据,特别适用于OnStart,OnSleep和OnResume方法。 这可以使用Application.Current.Properties从Xamarin.Forms代码中的任何地方访问。
属性字典使用字符串键并存储对象值。
例如,你可以在你的代码的任何地方设置一个持久的“id”属性(当一个项目被选中,在一个页面的OnDisappearing方法或者OnSleep方法中),像这样:
点击(此处)折叠或打开
- Application.Current.Properties ["id"] = someClass.ID;
点击(此处)折叠或打开
- if (Application.Current.Properties.ContainsKey("id"))
- {
- var id = Application.Current.Properties ["id"] as int;
- // do something with id
- }
注意:“属性”字典只能序列化原始类型进行存储。 试图存储其他类型(如List )可能会失败。
持久化
属性字典自动保存到设备。 添加到字典中的数据将在应用程序从后台返回或重新启动后可用。
Xamarin.Forms 1.4在Application类中引入了一个额外的方法--SavePropertiesAsync() - 可以调用它来主动保留属性字典。 这是为了让您在重要更新之后保存属性,而不是由于崩溃或被操作系统杀死而导致无法序列化。
您可以在“使用Xamarin.Forms创建移动应用程序”第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(应用程序,选项);。
点击(此处)折叠或打开
- [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);
- }
- }
- [Register ("AppDelegate")]
Android项目t
Android MainActivity现在从FormsApplicationActivity继承。 在OnCreate覆盖中,使用App类的实例调用LoadApplication方法。
点击(此处)折叠或打开
- [Activity (Label = "App Lifecycle Sample", Icon = "@drawable/icon", MainLauncher = true,
- ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
- public class MainActivity :
- global::Xamarin.Forms.Platform.Android.FormsApplicationActivity // superclass new in 1.3
- {
- 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
- }
- }
注意:有一个更新的FormsAppCompatActivity基类,可用于更好地支持Android Material Design。 这将成为未来的默认Android模板,但您可以按照这些说明来更新您现有的Android应用程序。
Windows电话项目
Windows Phone(基于Silverlight的)项目中的主页应该从FormsApplicationPage继承。 这意味着XAML和MainPage的C#引用FormsApplicationPage类,如图所示。
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:
点击(此处)折叠或打开
- winPhone:FormsApplicationPage
- ...
- xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
- ...>
- /winPhone:FormsApplicationPage>
C#继承自FormsApplicationPage类,并调用LoadApplication来创建Xamarin.Forms应用程序的一个实例。 请注意,明确使用应用程序名称空间来限定应用程序是一种很好的做法,因为Windows Phone应用程序也具有与Xamarin.Forms无关的自己的App类。
public partial class MainPage : global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3 { public MainPage() { InitializeComponent(); SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape; global::Xamarin.Forms.Forms.Init(); LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3, use the correct namespace } }
点击(此处)折叠或打开
- public partial class MainPage :
- global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3
- {
- public MainPage()
- {
- InitializeComponent();
- SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
-
- global::Xamarin.Forms.Forms.Init();
- LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3, use the correct namespace
- }
- }
Windows 8.1项目
Windows 8.1(基于WinRT的)项目中的主页现在应该从WindowsPage继承。 这意味着MainPage的XAML引用WindowsPage类,如下所示:
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:
点击(此处)折叠或打开
- forms:WindowsPage
- ...
- xmlns:forms="using:Xamarin.Forms.Platform.WinRT"
- ...>
- /forms:WindowsPage>
C#代码隐藏的构造必须调用LoadApplication来创建Xamarin.Forms应用程序的一个实例。 请注意,明确使用应用程序名称空间来限定应用程序是一种很好的做法,因为UWP应用程序也具有与Xamarin.Forms无关的自己的App类。
点击(此处)折叠或打开
- public partial class MainPage
- {
- public MainPage()
- {
- InitializeComponent();
- LoadApplication(new YOUR_APP_NAMESPACE.App());
- }
- }
用于Windows 10的通用Windows项目(UWP)
Xamarin.Forms中的通用Windows项目支持目前处于预览状态。 UWP项目中的主页面应该从WindowsPage继承。 这意味着XAML和MainPage的C#引用FormsApplicationPage类,如图所示。
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:
点击(此处)折叠或打开
- forms:WindowsPage
- ...
- xmlns:forms="using:Xamarin.Forms.Platform.UWP"
- ...>
- /forms:WindowsPage>
点击(此处)折叠或打开
- public sealed partial class MainPage
- {
- public MainPage()
- {
- InitializeComponent();
-
- LoadApplication(new YOUR_NAMESPACE.App());
- }
- }