using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls; using Avalonia.Rendering; using Avalonia; using Avalonia.VisualTree; namespace Harmonia.UI.Platform; public abstract class PlatformServiceLocator : IPlatformServiceLocator { public T? Get() { //Desktop if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { if (desktop.MainWindow == null) return default; return GetFromWindow(desktop.MainWindow); } //Android (and iOS?) else if (Application.Current?.ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) { if (singleViewPlatform.MainView == null) return default; IRenderRoot? visualRoot = singleViewPlatform.MainView.GetVisualRoot(); if (visualRoot is TopLevel topLevel) { return GetFromTopLevel(topLevel); } } return default; } protected abstract T? GetFromWindow(Window mainWindow); protected abstract T? GetFromTopLevel(TopLevel topLevel); }