diff --git a/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs b/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs
index 76c9c2a..6309438 100644
--- a/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs
+++ b/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs
@@ -11,6 +11,13 @@ public interface IUiPageBehavior
/// 页面视图实例
object View { get; }
+ ///
+ /// 获取键值
+ ///
+ /// 返回当前对象的键标识符
+ string Key { get; }
+
+
///
/// 获取页面是否处于活动状态
///
diff --git a/GFramework.Game.Abstractions/ui/IUiRouter.cs b/GFramework.Game.Abstractions/ui/IUiRouter.cs
index c942344..aeefefc 100644
--- a/GFramework.Game.Abstractions/ui/IUiRouter.cs
+++ b/GFramework.Game.Abstractions/ui/IUiRouter.cs
@@ -80,7 +80,14 @@ public interface IUiRouter : ISystem
/// 获取当前栈顶UI的Key
///
/// 当前UI Key,如果栈为空返回空字符串
- string Peek();
+ string PeekKey();
+
+ ///
+ /// 获取当前栈顶的UI页面行为对象
+ ///
+ /// 栈顶的IUiPageBehavior对象,如果栈为空则返回null
+ IUiPageBehavior Peek();
+
///
/// 判断指定UI是否为当前栈顶UI
diff --git a/GFramework.Game/ui/UiRouterBase.cs b/GFramework.Game/ui/UiRouterBase.cs
index 6733713..aa9738e 100644
--- a/GFramework.Game/ui/UiRouterBase.cs
+++ b/GFramework.Game/ui/UiRouterBase.cs
@@ -1,3 +1,7 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
using GFramework.Core.Abstractions.logging;
using GFramework.Core.extensions;
using GFramework.Core.logging;
@@ -201,15 +205,26 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
AfterChange(@event);
}
+
///
- /// 获取栈顶元素的视图类型名称
+ /// 获取页面栈顶元素的键值,但不移除该元素
///
- /// 如果栈为空则返回空字符串,否则返回栈顶元素视图类型的名称
- public string Peek()
+ /// 如果页面栈为空则返回空字符串,否则返回栈顶元素的键值
+ public string PeekKey()
{
- return _stack.Count == 0 ? string.Empty : _stack.Peek().View.GetType().Name;
+ return _stack.Count == 0 ? string.Empty : _stack.Peek().Key;
}
+ ///
+ /// 获取页面栈顶元素,但不移除该元素
+ ///
+ /// 返回栈顶的IUiPageBehavior元素
+ public IUiPageBehavior Peek()
+ {
+ return _stack.Peek();
+ }
+
+
///
/// 判断栈顶元素是否指定的UI类型
///
@@ -217,10 +232,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
/// 如果栈为空或栈顶元素类型不匹配则返回false,否则返回true
public bool IsTop(string uiKey)
{
- if (_stack.Count == 0)
- return false;
-
- return _stack.Peek().View.GetType().Name == uiKey;
+ return _stack.Count != 0 && _stack.Peek().Key.Equals(uiKey);
}
///
@@ -230,7 +242,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
/// 如果栈中存在指定类型的UI元素则返回true,否则返回false
public bool Contains(string uiKey)
{
- return _stack.Any(p => p.View.GetType().Name == uiKey);
+ return _stack.Any(p => p.Key.Equals(uiKey));
}
///
@@ -265,7 +277,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
{
return new UiTransitionEvent
{
- FromUiKey = Peek(),
+ FromUiKey = PeekKey(),
ToUiKey = toUiKey,
TransitionType = type,
Policy = policy ?? UiTransitionPolicy.Exclusive,
@@ -289,7 +301,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
private void AfterChange(UiTransitionEvent @event)
{
Log.Debug("AfterChange phases started: {0}", @event.TransitionType);
- _ = Task.Run(async () =>
+ _ = Task.Run(async () =>
{
try
{
diff --git a/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs b/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs
index 94da6db..4bd7673 100644
--- a/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs
+++ b/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs
@@ -9,16 +9,24 @@ namespace GFramework.Godot.ui;
/// 支持所有继承自 CanvasItem 的节点
///
/// CanvasItem 类型的视图节点
-public class CanvasItemUiPageBehavior(T owner) : IUiPageBehavior
+public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior
where T : CanvasItem
{
private readonly IUiPage? _page = owner as IUiPage;
///
- /// 页面视图对象
+ /// 获取页面视图对象
///
+ /// 返回与当前实例关联的视图对象
public object View => owner;
+ ///
+ /// 获取当前实例的键值标识符
+ ///
+ /// 返回用于标识当前实例的键字符串
+ public string Key => key;
+
+
///
/// 获取页面是否存活状态
///