应用程序基类提供以下功能,这些功能在您的项目默认应用程序子类中公开:
-
一个MainPage属性,它是为应用程序设置初始页面的地方。
-
持久性属性字典,用于跨生命周期状态更改存储简单值。
-
包含对当前应用程序对象的引用的静态Current属性。
还暴露生命周期方法,如OnStart,OnSleep和OnResume以及模态导航事件。
根据您选择的模板,可以通过以下两种方式之一来定义App类:
要使用XAML创建应用程序类,默认应用程序类必须替换为XAML应用程序类和关联的代码隐藏,如以下代码示例所示:
-
<Application xmlns="" xmlns:x="" 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
-
}
-
}
属性字典
Application子类具有一个静态属性字典,可用于存储数据,特别适用于OnStart,OnSleep和OnResume方法。 这可以使用Application.Current.Properties从Xamarin.Forms代码中的任何地方访问。
属性字典使用字符串键并存储对象值。
例如,你可以在你的代码的任何地方设置一个持久的“id”属性(当一个项目被选中,在一个页面的OnDisappearing方法或者OnSleep方法中),像这样:
-
Application.Current.Properties ["id"] = someClass.ID;
在OnStart或OnResume方法中,您可以使用此值以某种方式重新创建用户的体验。 属性字典存储对象,所以在使用它之前需要转换它的值。
-
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继承。 这应该:
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 { public MainPage() { InitializeComponent(); SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape; global::Xamarin.Forms.Forms.Init(); LoadApplication(new YOUR_APP_NAMESPACE.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
-
}
-
}
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());
-
}
-
}
请注意Forms.Init()必须在第65行的App.xaml.cs中调用。
用于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>
C#代码隐藏的构造必须调用LoadApplication来创建Xamarin.Forms应用程序的一个实例。 请注意,明确使用应用程序名称空间来限定应用程序是一种很好的做法,因为UWP应用程序也具有与Xamarin.Forms无关的自己的App类。
-
public sealed partial class MainPage
-
{
-
public MainPage()
-
{
-
InitializeComponent();
-
-
LoadApplication(new YOUR_NAMESPACE.App());
-
}
-
}
请注意,Forms.Init()必须在第63行的App.xaml.cs中调用。
阅读(2585) | 评论(0) | 转发(0) |