Документация по Avalonia UI
< Все темы
Печать

Жизненные циклы приложения

Платформы не созданы равными. Управление жизненным циклом, к которому мы привыкли в Windows Forms и WPF, может работать только на настольных платформах. AvaloniaUI — это кроссплатформенный фреймворк, поэтому, чтобы помочь вашему приложению быть переносимым, мы предоставляем различные модели жизненного цикла для вашего приложения и позволяем вам контролировать все вручную, если платформа позволяет нам это делать.

Как работают жизненные циклы?

Предпочтительный способ инициализации вашего приложения на десктопе:

class Program
{
  // This method is needed for IDE previewer infrastructure
  public static AppBuilder BuildAvaloniaApp() 
    => AppBuilder.Configure<App>().UsePlatformDetect();

  // The entry point. Things aren't ready yet, so at this point
  // you shouldn't use any Avalonia types or anything that expects
  // a SynchronizationContext to be ready
  public static int Main(string[] args) 
    => BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
}

Итак, где находится главное окно настройки? Теперь он перемещен в класс Application:

public override void OnFrameworkInitializationCompleted()
{
  if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
    desktop.MainWindow = new MainWindow();
  else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView)
    singleView.MainView = new MainView();
  base.OnFrameworkInitializationCompleted();
}

Этот метод вызывается, когда платформа готова к использованию, а свойство ApplicationLifetime содержит выбранный цикл жизни, если он есть. Если ваше приложение запускается в режиме разработки процессом предварительного просмотра IDE, ApplicationLifetime имеет значение null.

Типы жизненного цикла

Конкретный жизненный цикл может предоставлять разные аспекты, поэтому у нас есть набор интерфейсов для доступа к ним.

IControlledApplicationLifetime

Предоставлен:

  • StartWithClassicDesktopLifetime
  • StartLinuxFramebuffer

Позволяет подписываться на события Startup Exit и явно завершать работу приложения, вызывая метод Shutdown. Также обеспечивает управление кодом выхода приложения.

IClassicDesktopStyleApplicationLifetime

Наследует: IControlledApplicationLifetime

Предоставлен:

  • StartWithClassicDesktopLifetime

Позволяет вам контролировать цикл жизни вашего приложения в стиле WindowsForms/WPF. Предоставляет способ получить доступ к списку открытых в данный момент окон, установить главное окно и 3 режима закрытия:

  • OnLastWindowClose — закрывает приложение при закрытии последнего окна.
  • OnMainWindowClose — закрывает приложение при закрытии MainWindow, если установлено значение MainWindow.
  • OnExplicitShutdown — отключает автоматическое завершение работы приложения, нужно вызывать Shutdown вручную

ISingleViewApplicationLifetime

Предоставлено:

  • StartLinuxFramebuffer
  • мобильные платформы (WIP)

Некоторые платформы не имеют концепции окна рабочего стола и допускают только одно представление на экране одновременно. Для таких платформ такой жизненный цикл позволяет устанавливать и изменять MainView. На данный момент мы не предоставляем собственную реализацию стека навигации, но вы можете использовать ее из ReactiveUI.

Ручное управление сроком службы

Мы не принуждаем вас использовать нашу модель жизненного цикла на платформах, которые позволяют нам это делать. На настольных платформах вы можете передать делегат AppMain в BuildAvaloniaApp.Start и оттуда управлять вручную:

Дополнительные документы будут позже, а пока смотрите: Issue #2564 и PR 2676.

class Program
{
  // This method is needed for IDE previewer infrastructure
  public static AppBuilder BuildAvaloniaApp() 
    => AppBuilder.Configure<App>().UsePlatformDetect();

  // The entry point. Things aren't ready yet, so at this point
  // you shouldn't use any Avalonia types or anything that expects
  // a SynchronizationContext to be ready
  public static int Main(string[] args) 
    => BuildAvaloniaApp().Start(AppMain, args);

  // Application entry point. Avalonia is completely initialized.
  static void AppMain(Application app, string[] args)
  {
     // A cancellation token source that will be used to stop the main loop
     var cts = new CancellationTokenSource();
     
     // Do you startup code here
     new Window().Show();

     // Start the main loop
     app.Run(cts.Token);
  }
}

 

Оглавление