Жизненные циклы приложения
Платформы не созданы равными. Управление жизненным циклом, к которому мы привыкли в 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); } }