Класс App Xamarin.FormsXamarin.Forms App Class

Базовый класс Application предлагает следующие возможности, которые предоставляются в используемом по умолчанию подклассе App проекта:The Application base class offers the following features, which are exposed in your projects default App subclass:

  • Свойство MainPage используется для задания начальной страницы для приложения.A MainPage property, which is where to set the initial page for the app.
  • Сохраняемый словарь Properties для хранения простых значений в рамках изменений состояния жизненного цикла.A persistent Properties dictionary to store simple values across lifecycle state changes.
  • Статическое свойство Current, содержащее ссылку на текущий объект приложения.A static Current property that contains a reference to the current application object.

Он также предоставляет методы жизненного цикла, например OnStart, OnSleep и OnResume, а также события модальной навигации.It also exposes Lifecycle methods such as OnStart, OnSleep, and OnResume as well as modal navigation events.

В зависимости от выбранного шаблона класс App можно определить одним из двух способов:Depending on which template you chose, the App class could be defined in one of two ways:

  • C# илиC#, or
  • XAML и C#XAML & C#

Чтобы создать класс App с помощью XAML, необходимо заменить класс App по умолчанию классом App XAML и соответствующим кодом программной части, как показано в следующем примере кода:To create an App class using XAML, the default App class must be replaced with a XAML App class and associated code-behind, as shown in the following code example:

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

</Application>

В следующем примере показан соответствующий код программной части:The following code example shows the associated code-behind:

public partial class App : Application
{
    public App ()
    {
        InitializeComponent ();
        MainPage = new HomePage ();
    }
    ...
}

Помимо задания свойства MainPage, в коде программной части должен вызываться метод InitializeComponent для загрузки и анализа соответствующего кода XAML.As well as setting the MainPage property, the code-behind must also call the InitializeComponent method to load and parse the associated XAML.

Свойство MainPageMainPage property

Свойство MainPage в классе Application задает корневую страницу приложения.The MainPage property on the Application class sets the root page of the application.

Например, вы можете создать в своем классе App логику для отображения другой страницы в зависимости от того, вошел ли пользователь в систему.For example, you can create logic in your App class to display a different page depending on whether the user is logged in or not.

Свойство MainPage должно быть задано в конструкторе App.The MainPage property should be set in the App constructor,

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

Словарь PropertiesProperties dictionary

Подкласс Application имеет статический словарь Properties, который позволяет хранить данные, в частности, для использования в методах OnStart, OnSleep и OnResume.The Application subclass has a static Properties dictionary which can be used to store data, in particular for use in the OnStart, OnSleep, and OnResume methods. Обратиться к нему можно из любой части кода Xamarin.Forms с помощью Application.Current.Properties.This can be accessed from anywhere in your Xamarin.Forms code using Application.Current.Properties.

Словарь Properties использует ключ string и сохраняет значение object.The Properties dictionary uses a string key and stores an object value.

Например, можно задать постоянное свойство "id" в любой части кода (при выборе элемента в методе OnDisappearing страницы или в методе OnSleep) следующим образом:For example, you could set a persistent "id" property anywhere in your code (when an item is selected, in a page's OnDisappearing method, or in the OnSleep method) like this:

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

В методах OnStart или OnResume это значение можно использовать для воссоздания взаимодействия с пользователем некоторым образом.In the OnStart or OnResume methods you can then use this value to recreate the user's experience in some way. Словарь Properties хранит объекты object, поэтому вам не требуется приводить его значение перед использованием.The Properties dictionary stores objects so you need to cast its value before using it.

if (Application.Current.Properties.ContainsKey("id"))
{
    var id = Application.Current.Properties ["id"] as int;
    // do something with id
}

Всегда проверяйте наличие ключа перед обращением, чтобы предотвратить непредвиденные ошибки.Always check for the presence of the key before accessing it to prevent unexpected errors.

Примечание

Словарь Properties может сериализировать только примитивные типы для хранения.The Properties dictionary can only serialize primitive types for storage. Попытка сохранить другие типы (например, List<string>) может завершиться сбоем без каких-либо сообщений.Attempting to store other types (such as List<string>) can fail silently.

СохраняемостьPersistence

Словарь Properties автоматически сохраняется на устройстве.The Properties dictionary is saved to the device automatically. Данные, добавленные в словарь, будут доступны при возврате приложения в фоновый режим или даже после его перезапуска.Data added to the dictionary will be available when the application returns from the background or even after it is restarted.

В Xamarin.Forms 1.4 представлен дополнительный метод класса Application — SavePropertiesAsync(), который можно вызвать для упреждающего сохранения словаря Properties.Xamarin.Forms 1.4 introduced an additional method on the Application class - SavePropertiesAsync() - which can be called to proactively persist the Properties dictionary. Это позволяет сохранить свойства после важных обновлений, не рискуя, что они будут отсериализированы из-за сбоя либо завершены операционной системой.This is to allow you to save properties after important updates rather than risk them not getting serialized out due to a crash or being killed by the OS.

Ссылки на использование словаря Properties можно найти в главах 6, 15 и 20 книги о создании мобильных приложений с помощью Xamarin.Forms, а также в соответствующих примерах.You can find references to using the Properties dictionary in the Creating Mobile Apps with Xamarin.Forms book chapters 6, 15, and 20, and in the associated samples.

Класс ApplicationThe Application class

Полная реализация класса Application приведена ниже для справки:A complete Application class implementation is shown below for reference:

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 загружается и отображается для пользователя.This class is then instantiated in each platform-specific project and passed to the LoadApplication method which is where the MainPage is loaded and displayed to the user. Код для каждой из платформ приведен в разделах ниже.The code for each platform is shown in the following sections. Последние шаблоны решений Xamarin.Forms уже содержат весь этот код, предварительно настроенный для вашего приложения.The latest Xamarin.Forms solution templates already contain all this code, preconfigured for your app.

Проект iOSiOS project

Класс AppDelegate iOS наследует от FormsApplicationDelegate.The iOS AppDelegate class inherits from FormsApplicationDelegate. Он должен:It should:

  • вызывать LoadApplication с экземпляром класса App;Call LoadApplication with an instance of the App class.

  • всегда возвращать base.FinishedLaunching (app, options);.Always return 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);
    }
}

Проект AndroidAndroid project

Класс MainActivity Android наследует от FormsAppCompatActivity.The Android MainActivity inherits from FormsAppCompatActivity. В переопределении OnCreate метод LoadApplication вызывается с помощью экземпляра класса App.In the OnCreate override the LoadApplication method is called with an instance of the App class.

[Activity (Label = "App Lifecycle Sample", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true,
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : FormsAppCompatActivity
{
    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
    }
}

Проект для универсальной платформы Windows (UWP) для Windows 10Universal Windows project (UWP) for Windows 10

Главная страница в проекте UWP должна быть производной от WindowsPage:The main page in the UWP project should inherit from WindowsPage:

<forms:WindowsPage
   ...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
   ...>
</forms:WindowsPage>

Код C#, отвечающий за создание, должен вызывать LoadApplication для создания экземпляра вашего App Xamarin.Forms.The C# code behind construction must call LoadApplication to create an instance of your Xamarin.Forms App. Обратите внимание, что рекомендуется явно использовать пространство имен приложения для уточнения App, так как приложения UWP также имеют свой собственный класс App, не связанный с Xamarin.Forms.Note that it is good practice to explicitly use the application namespace to qualify the App because UWP applications also have their own App class unrelated to Xamarin.Forms.

public sealed partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();

        LoadApplication(new YOUR_NAMESPACE.App());
    }
 }

Обратите внимание, что Forms.Init() в проекте UWP следует вызывать из App.xaml.cs.Note that Forms.Init() must be called from App.xaml.cs in the UWP project.

Дополнительные сведения см. в разделе Настройка проектов Windows, в котором указаны шаги для добавления проекта UWP в существующее решение Xamarin.Forms, которое не предназначено для UWP.For more information, see Setup Windows Projects, which includes steps to add a UWP project to an existing Xamarin.Forms solution that doesn't target UWP.