Files
2026-04-13 12:08:09 +03:00

77 lines
2.8 KiB
C#

using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
namespace GSS2.UI.Core.Services;
/// <summary>
/// <see cref="NavigationService"/> - сервис навигации между компонентами,
/// работающий с режимами главного окна <see cref="IClassicDesktopStyleApplicationLifetime"/>
/// и одного представления <see cref="ISingleViewApplicationLifetime"/>.<br/>
/// Условием его работы в режиме главного окна является то, что
/// <see cref="IClassicDesktopStyleApplicationLifetime.MainWindow"/> является
/// <see cref="MainWindow"/>
/// </summary>
public class NavigationService
{
private readonly Stack<Control> _navigateControls = new Stack<Control>();
private readonly IApplicationLifetime? _applicationLifetime;
public NavigationService(IApplicationLifetime? applicationLifetime)
{
_applicationLifetime = applicationLifetime;
}
/// <summary>
/// Перейти к новому элементу управления
/// </summary>
/// <param name="control">Новый элемент управления</param>
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;
}
}
/// <summary>
/// Вернутся к предыдущему элементу управления
/// </summary>
/// <param name="dispose">
/// Если <see langword="true"/> и если элемент управления от которого происходит переход, реализует интерфейс
/// <see cref="IDisposable"/>, то будет вызван его метод <see cref="IDisposable.Dispose"/>
/// </param>
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();
}
}