using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Threading; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using PLib.Desktop.Controls; using PLib.Desktop.Imaging; using PLib.Desktop.ViewModels; using PLib.Desktop.Views; namespace PLib.Desktop; // Fully qualified: the PLib.Application namespace shadows the Application type in this assembly. public sealed class App : Avalonia.Application { private IHost? _host; public override void Initialize() => AvaloniaXamlLoader.Load(this); public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { _host = AppHost.Create(desktop.Args ?? []); _host.Start(); AsyncImage.Loader = _host.Services.GetRequiredService(); var viewModel = _host.Services.GetRequiredService(); desktop.MainWindow = new MainWindow { DataContext = viewModel }; desktop.Exit += OnExit; // Kick the first load off once the dispatcher is running, so a failure surfaces // through the view model instead of disappearing into an unobserved task. Dispatcher.UIThread.Post( () => viewModel.InitializeCommand.Execute().Subscribe(), DispatcherPriority.Background); } base.OnFrameworkInitializationCompleted(); } private void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs e) { if (_host is null) { return; } _host.StopAsync(TimeSpan.FromSeconds(3)).GetAwaiter().GetResult(); _host.Dispose(); _host = null; } }