forked from amkovkov/GranuSightSoftware2
77 lines
2.8 KiB
C#
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();
|
|
}
|
|
}
|