122 lines
3.1 KiB
C#
122 lines
3.1 KiB
C#
|
|
using System.Collections.Generic;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// UI导航栈管理器
|
|||
|
|
/// 负责管理窗口的入栈、出栈和返回历史
|
|||
|
|
/// </summary>
|
|||
|
|
public class UINavigationManager
|
|||
|
|
{
|
|||
|
|
#region Singleton
|
|||
|
|
private static UINavigationManager _instance;
|
|||
|
|
public static UINavigationManager Instance
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (_instance == null)
|
|||
|
|
{
|
|||
|
|
_instance = new UINavigationManager();
|
|||
|
|
}
|
|||
|
|
return _instance;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private UINavigationManager() { }
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Fields
|
|||
|
|
/// <summary>
|
|||
|
|
/// 导航栈:存储窗口的返回历史
|
|||
|
|
/// </summary>
|
|||
|
|
private List<UIWindow> _navigationStack = new List<UIWindow>(8);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 对外只读访问(用于兼容旧代码)
|
|||
|
|
/// </summary>
|
|||
|
|
public List<UIWindow> NavigationStack => _navigationStack;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 栈中窗口数量
|
|||
|
|
/// </summary>
|
|||
|
|
public int Count => _navigationStack.Count;
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Stack Operations
|
|||
|
|
/// <summary>
|
|||
|
|
/// 处理窗口入栈(根据配置)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="window">窗口实例</param>
|
|||
|
|
/// <param name="stackMode">栈管理模式</param>
|
|||
|
|
public void HandleWindowOpen(UIWindow window, UIStackMode stackMode)
|
|||
|
|
{
|
|||
|
|
if (window == null) return;
|
|||
|
|
|
|||
|
|
switch (stackMode)
|
|||
|
|
{
|
|||
|
|
case UIStackMode.None:
|
|||
|
|
// 不入栈(如Tips、HUD)
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case UIStackMode.Stackable:
|
|||
|
|
// 普通入栈
|
|||
|
|
if (!_navigationStack.Contains(window))
|
|||
|
|
{
|
|||
|
|
_navigationStack.Add(window);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case UIStackMode.Replace:
|
|||
|
|
// 替换栈顶
|
|||
|
|
if (_navigationStack.Count > 0)
|
|||
|
|
{
|
|||
|
|
var top = _navigationStack[_navigationStack.Count - 1];
|
|||
|
|
_navigationStack.RemoveAt(_navigationStack.Count - 1);
|
|||
|
|
}
|
|||
|
|
_navigationStack.Add(window);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case UIStackMode.ClearAndPush:
|
|||
|
|
// 清空后入栈
|
|||
|
|
_navigationStack.Clear();
|
|||
|
|
_navigationStack.Add(window);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 处理窗口关闭(出栈)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="window">窗口实例</param>
|
|||
|
|
public void HandleWindowClose(UIWindow window)
|
|||
|
|
{
|
|||
|
|
if (window != null && _navigationStack.Contains(window))
|
|||
|
|
{
|
|||
|
|
_navigationStack.Remove(window);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取栈顶窗口
|
|||
|
|
/// </summary>
|
|||
|
|
public UIWindow GetTopWindow()
|
|||
|
|
{
|
|||
|
|
return _navigationStack.Count > 0 ? _navigationStack[_navigationStack.Count - 1] : null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检查窗口是否在栈中
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsWindowInStack(UIWindow window)
|
|||
|
|
{
|
|||
|
|
return _navigationStack.Contains(window);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 清空栈
|
|||
|
|
/// </summary>
|
|||
|
|
public void Clear()
|
|||
|
|
{
|
|||
|
|
_navigationStack.Clear();
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|