refactor: NavigateService

This commit is contained in:
2026-04-13 12:08:09 +03:00
parent 16c5b5d42f
commit 09aab44a3c
+23 -6
View File
@@ -1,12 +1,19 @@
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.ApplicationLifetimes;
namespace GSS2.UI.Core.Services; 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 public class NavigationService
{ {
private readonly Stack<UserControl> _navigateControls = new Stack<UserControl>(); private readonly Stack<Control> _navigateControls = new Stack<Control>();
private readonly IApplicationLifetime? _applicationLifetime; private readonly IApplicationLifetime? _applicationLifetime;
public NavigationService(IApplicationLifetime? applicationLifetime) public NavigationService(IApplicationLifetime? applicationLifetime)
@@ -14,7 +21,11 @@ public class NavigationService
_applicationLifetime = applicationLifetime; _applicationLifetime = applicationLifetime;
} }
public void NavigateTo(UserControl control) /// <summary>
/// Перейти к новому элементу управления
/// </summary>
/// <param name="control">Новый элемент управления</param>
public void NavigateTo(Control control)
{ {
_navigateControls.Push(control); _navigateControls.Push(control);
@@ -22,7 +33,6 @@ public class NavigationService
{ {
case IClassicDesktopStyleApplicationLifetime desktop case IClassicDesktopStyleApplicationLifetime desktop
when desktop.MainWindow is MainWindow mainWindow: when desktop.MainWindow is MainWindow mainWindow:
mainWindow.SetControl(control); mainWindow.SetControl(control);
break; break;
@@ -32,7 +42,14 @@ public class NavigationService
} }
} }
public void NavigateBack() /// <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) if (_navigateControls.Count <= 1)
return; return;
@@ -53,7 +70,7 @@ public class NavigationService
break; break;
} }
if (lastControl is IDisposable disposable) if (dispose && lastControl is IDisposable disposable)
disposable.Dispose(); disposable.Dispose();
} }
} }