using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; namespace GSS2.UI.Core.Services; /// /// - сервис навигации между компонентами, /// работающий с режимами главного окна /// и одного представления .
/// Условием его работы в режиме главного окна является то, что /// является /// ///
public class NavigationService { private readonly Stack _navigateControls = new Stack(); private readonly IApplicationLifetime? _applicationLifetime; public NavigationService(IApplicationLifetime? applicationLifetime) { _applicationLifetime = applicationLifetime; } /// /// Перейти к новому элементу управления /// /// Новый элемент управления public void NavigateTo(Control control) { _navigateControls.Push(control); switch (_applicationLifetime) { case IClassicDesktopStyleApplicationLifetime desktop when desktop.MainWindow is MainWindow mainWindow: mainWindow.SetControl(control); break; case ISingleViewApplicationLifetime singleView: singleView.MainView = control; break; } } /// /// Вернутся к предыдущему элементу управления /// /// /// Если и если элемент управления от которого происходит переход, реализует интерфейс /// , то будет вызван его метод /// public void NavigateBack(bool dispose = true) { if (_navigateControls.Count <= 1) return; var lastControl = _navigateControls.Pop(); var control = _navigateControls.Peek(); switch (_applicationLifetime) { case IClassicDesktopStyleApplicationLifetime desktop when desktop.MainWindow is MainWindow mainWindow: mainWindow.SetControl(control); break; case ISingleViewApplicationLifetime singleView: singleView.MainView = control; break; } if (dispose && lastControl is IDisposable disposable) disposable.Dispose(); } }