Xamarin.Forms 基础——App Class

来源:互联网 发布:大逃杀游戏知乎 编辑:程序博客网 时间:2024/06/05 21:01

应用程序类

默认App类的功能,可以是C#或XAML

PDF用于离线使用
  • 下载PDF

让我们知道你对此的感受

最后更新:2016年2月

Application基类提供了以下功能,这是在项目的默认露App子类:

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

如果还自曝生命周期方法,如OnStartOnSleepOnResume以及模式导航事件。

根据您选择的模板,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可用于存储数据,特别是用于在使用词典OnStartOnSleepOnResume方法。这可以从您在Xamarin.Forms代码中使用的任何地方访问Application.Current.Properties

Properties词典使用string键和存储的object值。

例如,您可以"id"在代码中的任何位置(选择项目,页面OnDisappearing方法或OnSleep方法中)设置一个持久性属性,如下所示:

Application.Current.Properties ["id"] = someClass.ID;

OnStartOnResume方法中,您可以使用此值以某种方式重新创建用户的体验。该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。请注意,明确使用应用程序命名空间来限定AppWindows 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中调用它。

原创粉丝点击