Managing application startup, shutdown, and lifetime events in Avalonia UI
Avalonia provides a flexible application lifetime management system that adapts to different application types, from desktop applications with windows to mobile single-view apps.
using Avalonia;using Avalonia.Controls.ApplicationLifetimes;public class App : Application{ public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { desktop.MainWindow = new MainWindow { DataContext = new MainWindowViewModel() }; } base.OnFrameworkInitializationCompleted(); }}
Program.cs
public static void Main(string[] args){ BuildAvaloniaApp().StartWithClassicDesktopLifetime( args, lifetime => { lifetime.MainWindow = new MainWindow(); lifetime.ShutdownMode = ShutdownMode.OnMainWindowClose; } );}
Desktop applications support three shutdown modes:
ShutdownMode Enum
public enum ShutdownMode{ OnLastWindowClose, // Exit when all windows are closed OnMainWindowClose, // Exit when main window closes OnExplicitShutdown // Exit only on Shutdown() call}
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop){ desktop.ShutdownMode = ShutdownMode.OnMainWindowClose; desktop.MainWindow = new MainWindow();}
The default ShutdownMode is OnLastWindowClose, which exits the application when all windows are closed.
Attempts to shut down the application, can be cancelled by event handlers:
TryShutdown Example
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop){ // Request shutdown (can be cancelled) bool shutdownSucceeded = desktop.TryShutdown(exitCode: 0); if (shutdownSucceeded) { Console.WriteLine("Application is shutting down"); } else { Console.WriteLine("Shutdown was cancelled"); }}
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop){ // Access all open windows IReadOnlyList<Window> windows = desktop.Windows; // Enumerate windows foreach (var window in windows) { Console.WriteLine($"Window: {window.Title}"); } // Find specific window var settingsWindow = windows .OfType<SettingsWindow>() .FirstOrDefault();}
Windows are automatically added to the Windows collection when shown and removed when closed.
Avalonia handles OS-level shutdown requests (e.g., Windows logoff, macOS shutdown):
Handling OS Shutdown
desktop.ShutdownRequested += (sender, e) =>{ if (e.IsOSShutdown) { // OS is shutting down // Save critical data immediately QuickSave(); // Can still cancel if needed // e.Cancel = true; }};
For testing or custom scenarios, you can set up without starting:
Setup Only
var lifetime = new ClassicDesktopStyleApplicationLifetime{ ShutdownMode = ShutdownMode.OnExplicitShutdown};AppBuilder.Configure<App>() .UsePlatformDetect() .SetupWithLifetime(lifetime);// Application is configured but not running// Manually start later:// lifetime.Start(args);
public class CustomApplicationLifetime : IApplicationLifetime{ // Implement custom lifetime behavior}// Use in AppBuildervar customLifetime = new CustomApplicationLifetime();builder.SetupWithLifetime(customLifetime);