【Xamarin.Forms】App类——默认App类的功能,可以是C#或XAML

应用程序基类提供以下功能,这些功能在您的项目默认应用程序子类中公开:

  • 一个MainPage属性,它是为应用程序设置初始页面的地方。
  • 持久性属性字典,用于跨生命周期状态更改存储简单值。
  • 包含对当前应用程序对象的引用的静态Current属性。

还暴露生命周期方法,如OnStart,OnSleep和OnResume以及模态导航事件。
根据您选择的模板,可以通过以下两种方式之一来定义App类:

  • C#,或者
  • XAML & C#

要使用XAML创建应用程序类,默认应用程序类必须替换为XAML应用程序类和关联的代码隐藏,如以下代码示例所示:

点击(此处)折叠或打开

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

  2. /Application>
下面的代码示例显示了相关的代码隐藏:

点击(此处)折叠或打开

  1. public partial class App : Application
  2. {
  3.     public App ()
  4.     {
  5.         InitializeComponent ();
  6.         MainPage = new HomePage ();
  7.     }
  8.     ...
  9. }
除了设置MainPage属性外,代码隐藏还必须调用InitializeComponent方法以加载和分析关联的XAML。


MainPage属性

Application类的MainPage属性设置应用程序的根页面。
例如,您可以在App类中创建逻辑,以根据用户是否登录来显示不同的页面。
MainPage属性应该在App构造函数中设置,

点击(此处)折叠或打开

  1. public class App : Xamarin.Forms.Application
  2. {
  3.     public App ()
  4.     {
  5.         MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
  6.     }
  7. }


属性字典

Application子类具有一个静态属性字典,可用于存储数据,特别适用于OnStart,OnSleep和OnResume方法。 这可以使用Application.Current.Properties从Xamarin.Forms代码中的任何地方访问。
属性字典使用字符串键并存储对象值。
例如,你可以在你的代码的任何地方设置一个持久的“id”属性(当一个项目被选中,在一个页面的OnDisappearing方法或者OnSleep方法中),像这样:

点击(此处)折叠或打开

  1. Application.Current.Properties ["id"] = someClass.ID;
在OnStart或OnResume方法中,您可以使用此值以某种方式重新创建用户的体验。 属性字典存储对象,所以在使用它之前需要转换它的值。

点击(此处)折叠或打开

  1. if (Application.Current.Properties.ContainsKey("id"))
  2. {
  3.     var id = Application.Current.Properties ["id"] as int;
  4.     // do something with id
  5. }
在访问密钥之前,请始终检查密钥是否存在以防意外错误。



注意:“属性”字典只能序列化原始类型进行存储。 试图存储其他类型(如List )可能会失败。

持久化

属性字典自动保存到设备。 添加到字典中的数据将在应用程序从后台返回或重新启动后可用。
Xamarin.Forms 1.4在Application类中引入了一个额外的方法--SavePropertiesAsync() - 可以调用它来主动保留属性字典。 这是为了让您在重要更新之后保存属性,而不是由于崩溃或被操作系统杀死而导致无法序列化。
您可以在“使用Xamarin.Forms创建移动应用程序”第6,15和20章以及相关示例中找到使用“属性”字典的参考。

应用程序类

下面显示了一个完整的Application类实现供参考:

点击(此处)折叠或打开

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

  7.     protected override void OnStart()
  8.     {
  9.         // Handle when your app starts
  10.         Debug.WriteLine ("OnStart");
  11.     }

  12.     protected override void OnSleep()
  13.     {
  14.         // Handle when your app sleeps
  15.         Debug.WriteLine ("OnSleep");
  16.     }

  17.     protected override void OnResume()
  18.     {
  19.         // Handle when your app resumes
  20.         Debug.WriteLine ("OnResume");
  21.     }
  22. }

然后在每个特定于平台的项目中对这个类进行实例化,并将其传递给LoadApplication方法,该方法是MainPage加载并显示给用户的地方。 每个平台的代码显示在下面的部分。 最新的Xamarin.Forms解决方案模板已经包含了所有为你的应用程序预配置的代码。


iOS项目

iOS AppDelegate类现在从FormsApplicationDelegate继承。 这应该:

  • 使用App类的实例调用LoadApplication。

  • 总是返回base.FinishedLaunching(应用程序,选项);。

    点击(此处)折叠或打开

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

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

    9.         return base.FinishedLaunching (app, options);
    10.     }
    11. }


Android项目t

Android MainActivity现在从FormsApplicationActivity继承。 在OnCreate覆盖中,使用App类的实例调用LoadApplication方法。

点击(此处)折叠或打开

  1. [Activity (Label = "App Lifecycle Sample", Icon = "@drawable/icon", MainLauncher = true,
  2.     ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
  3. public class MainActivity :
  4.     global::Xamarin.Forms.Platform.Android.FormsApplicationActivity // superclass new in 1.3
  5. {
  6.     protected override void OnCreate (Bundle bundle)
  7.     {
  8.         base.OnCreate (bundle);

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

  10.         LoadApplication (new App ()); // method is new in 1.3
  11.     }
  12. }


注意:有一个更新的FormsAppCompatActivity基类,可用于更好地支持Android Material Design。 这将成为未来的默认Android模板,但您可以按照这些说明来更新您现有的Android应用程序。

Windows电话项目

Windows Phone(基于Silverlight的)项目中的主页应该从FormsApplicationPage继承。 这意味着XAML和MainPage的C#引用FormsApplicationPage类,如图所示。
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:

点击(此处)折叠或打开

  1. winPhone:FormsApplicationPage
  2.    ...
  3.    xmlns:winPhone="clr-namespace:Xamarin.Forms.Platform.WinPhone;assembly=Xamarin.Forms.Platform.WP8"
  4.     ...>
  5. /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  }  }

点击(此处)折叠或打开

  1. public partial class MainPage :
  2.     global::Xamarin.Forms.Platform.WinPhone.FormsApplicationPage // superclass new in 1.3
  3. {
  4.     public MainPage()
  5.     {
  6.         InitializeComponent();
  7.         SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;

  8.         global::Xamarin.Forms.Forms.Init();
  9.         LoadApplication(new YOUR_APP_NAMESPACE.App()); // new in 1.3, use the correct namespace
  10.     }
  11.  }

Windows 8.1项目

Windows 8.1(基于WinRT的)项目中的主页现在应该从WindowsPage继承。 这意味着MainPage的XAML引用WindowsPage类,如下所示:
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:

点击(此处)折叠或打开

  1. forms:WindowsPage
  2.    ...
  3.    xmlns:forms="using:Xamarin.Forms.Platform.WinRT"
  4.    ...>
  5. /forms:WindowsPage>

C#代码隐藏的构造必须调用LoadApplication来创建Xamarin.Forms应用程序的一个实例。 请注意,明确使用应用程序名称空间来限定应用程序是一种很好的做法,因为UWP应用程序也具有与Xamarin.Forms无关的自己的App类。

点击(此处)折叠或打开

  1. public partial class MainPage
  2. {
  3.     public MainPage()
  4.     {
  5.         InitializeComponent();
  6.         LoadApplication(new YOUR_APP_NAMESPACE.App());
  7.     }
  8.  }
请注意Forms.Init()必须在第65行的App.xaml.cs中调用。


用于Windows 10的通用Windows项目(UWP)

Xamarin.Forms中的通用Windows项目支持目前处于预览状态。

UWP项目中的主页面应该从WindowsPage继承。 这意味着XAML和MainPage的C#引用FormsApplicationPage类,如图所示。
XAML使用自定义名称空间,以便根元素反映FormsApplicationPage类:

点击(此处)折叠或打开

  1. forms:WindowsPage
  2.    ...
  3.    xmlns:forms="using:Xamarin.Forms.Platform.UWP"
  4.    ...>
  5. /forms:WindowsPage>
C#代码隐藏的构造必须调用LoadApplication来创建Xamarin.Forms应用程序的一个实例。 请注意,明确使用应用程序名称空间来限定应用程序是一种很好的做法,因为UWP应用程序也具有与Xamarin.Forms无关的自己的App类。

点击(此处)折叠或打开

  1. public sealed partial class MainPage
  2. {
  3.     public MainPage()
  4.     {
  5.         InitializeComponent();

  6.         LoadApplication(new YOUR_NAMESPACE.App());
  7.     }
  8.  }
请注意,Forms.Init()必须在第63行的App.xaml.cs中调用。


你可能感兴趣的:(【Xamarin.Forms】App类——默认App类的功能,可以是C#或XAML)