应用程序类
默认App类的功能,可以是C#或XAML
该Application
基类提供了以下功能,这是在项目的默认露App
子类:
- 一个
MainPage
属性,它是设置应用程序初始页面的位置。 - 一个持久性
Properties
字典,用于在生命周期状态更改中存储简单值。 Current
包含对当前应用程序对象的引用的静态属性。
如果还自曝生命周期方法,如OnStart
,OnSleep
和OnResume
以及模式导航事件。
根据您选择的模板,App
可以通过以下两种方式之一定义该类:
- C#,或
- XAML&C#
要使用XAML 创建一个App类,默认的App类必须被替换为XAML 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属性
在MainPage
对房地产Application
类设置应用程序的根页面。
例如,您可以在App
类中创建逻辑,以根据用户是否登录来显示不同的页面。
该MainPage
属性应该在App
构造函数中设置,
public class App : Xamarin.Forms.Application
{
public App ()
{
MainPage = new ContentPage { Title = "App Lifecycle Sample" }; // your page here
}
}
属性词典
的Application
子类具有静态Properties
可用于存储数据,特别是用于在使用词典OnStart
,OnSleep
和OnResume
方法。这可以从您在Xamarin.Forms代码中使用的任何地方访问Application.Current.Properties
。
该Properties
词典使用string
键和存储的object
值。
例如,您可以"id"
在代码中的任何位置(选择项目,页面OnDisappearing
方法或OnSleep
方法中)设置一个持久性属性,如下所示:
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
字典。这是为了允许您在重要更新后保存属性,而不是由于崩溃或操作系统被杀死而无法序列化。
你可以找到参考使用Properties
字典中 与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
。这应该:
-
调用类
LoadApplication
的实例App
。 -
总是返回
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
现在继承了FormsApplicationActivity
。在OnCreate
覆盖中,该LoadApplication
方法使用App
类的实例调用。
[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 Phone项目
Windows Phone(Silverlight)项目中的主页应该继承FormsApplicationPage
。这意味着XAML和C#用于MainPage
引用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的实例App
。请注意,明确使用应用程序命名空间来限定App
Windows Phone应用程序也具有App
与Xamarin.Forms无关的类,这是很好的做法。
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
。这意味着XAML用于MainPage
引用WindowsPage
类,如下所示:
XAML使用自定义命名空间,以便根元素反映FormsApplicationPage
类:
<forms:WindowsPage
...
xmlns:forms="using:Xamarin.Forms.Platform.WinRT"
...>
</forms:WindowsPage>
C#codebehind的构造必须调用LoadApplication
来创建一个Xamarin.Forms的实例App
。请注意,明确使用应用程序命名空间来限定这一点是很好的做法,App
因为UWP应用程序也有自己的App
与Xamarin.Forms无关的类。
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和C#用于MainPage
引用FormsApplicationPage
所示的类。
XAML使用自定义命名空间,以便根元素反映FormsApplicationPage
类:
<forms:WindowsPage
...
xmlns:forms="using:Xamarin.Forms.Platform.UWP"
...>
</forms:WindowsPage>
C#codebehind的构造必须调用LoadApplication
来创建一个Xamarin.Forms的实例App
。请注意,明确使用应用程序命名空间来限定这一点是很好的做法,App
因为UWP应用程序也有自己的App
与Xamarin.Forms无关的类。
public sealed partial class MainPage
{
public MainPage()
{
InitializeComponent();
LoadApplication(new YOUR_NAMESPACE.App());
}
}
请注意,Forms.Init()
必须在第63行周围的App.xaml.cs中调用它。