refactor(ui): 更新UI路由和页面行为接口定义

- 修改HasVisibleInLayer方法签名,添加uiKey参数以精确检查特定UI可见性
- 在IUiPageBehavior接口中添加IsVisible属性用于获取页面可见状态
- 从IUiPageBehavior接口中移除RequiresMask属性
- 为ClearLayer和GetFromLayer方法添加完整的XML文档注释
- 更新CanvasItemUiPageBehavior实现以支持新的IsVisible属性
- 优化UI层级检查逻辑,提高可见性判断准确性
This commit is contained in:
GeWuYou 2026-02-07 19:49:13 +08:00
parent bcb82b1473
commit 0771a7ad85
4 changed files with 28 additions and 14 deletions

View File

@ -23,6 +23,11 @@ public interface IUiPageBehavior
/// </summary> /// </summary>
bool IsAlive { get; } bool IsAlive { get; }
/// <summary>
/// 获取页面是否可见
/// </summary>
bool IsVisible { get; }
/// <summary> /// <summary>
/// 获取页面是否为模态页面 /// 获取页面是否为模态页面
/// </summary> /// </summary>
@ -33,11 +38,6 @@ public interface IUiPageBehavior
/// </summary> /// </summary>
bool BlocksInput { get; } bool BlocksInput { get; }
/// <summary>
/// 获取页面是否需要蒙版
/// </summary>
bool RequiresMask { get; }
/// <summary> /// <summary>
/// 页面进入时调用的方法 /// 页面进入时调用的方法
/// </summary> /// </summary>

View File

@ -171,17 +171,25 @@ public interface IUiRouter : ISystem
/// <summary> /// <summary>
/// 清空指定层级的所有UI /// 清空指定层级的所有UI
/// </summary> /// </summary>
/// <param name="layer">要清空的UI层级。</param>
/// <param name="destroy">是否销毁UI实例。如果为true则会销毁UI实例否则仅从层级中移除。</param>
void ClearLayer(UiLayer layer, bool destroy = false); void ClearLayer(UiLayer layer, bool destroy = false);
/// <summary> /// <summary>
/// 从指定层级获取UI实例 /// 从指定层级获取UI实例
/// </summary> /// </summary>
/// <param name="uiKey">UI的唯一标识符。</param>
/// <param name="layer">要查询的UI层级。</param>
/// <returns>返回与指定键关联的UI行为接口实例如果未找到则返回null。</returns>
IUiPageBehavior? GetFromLayer(string uiKey, UiLayer layer); IUiPageBehavior? GetFromLayer(string uiKey, UiLayer layer);
/// <summary> /// <summary>
/// 判断指定层级是否存在可见UI /// 判断指定层级是否存在可见UI
/// </summary> /// </summary>
bool HasVisibleInLayer(UiLayer layer); /// <param name="uiKey">要检查的UI的唯一标识符</param>
/// <param name="layer">要检查的UI层级</param>
/// <returns>如果在指定层级中存在可见的UI则返回true否则返回false</returns>
bool HasVisibleInLayer(string uiKey, UiLayer layer);
#endregion #endregion
} }

View File

@ -607,9 +607,13 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
/// <summary> /// <summary>
/// 判断指定层级是否有UI显示 /// 判断指定层级是否有UI显示
/// </summary> /// </summary>
public bool HasVisibleInLayer(UiLayer layer) public bool HasVisibleInLayer(string uiKey, UiLayer layer)
{ {
return _layers.TryGetValue(layer, out var layerDict) && layerDict.Count > 0; if (!_layers.TryGetValue(layer, out var layerDict) ||
!layerDict.TryGetValue(uiKey, out var page))
return false;
return page.IsVisible;
} }
#endregion #endregion

View File

@ -1,4 +1,4 @@
using GFramework.Game.Abstractions.ui; using GFramework.Game.Abstractions.ui;
using GFramework.Godot.extensions; using GFramework.Godot.extensions;
using Godot; using Godot;
@ -30,8 +30,15 @@ public class CanvasItemUiPageBehavior<T>(T owner, string key) : IUiPageBehavior
/// <summary> /// <summary>
/// 获取页面是否存活状态 /// 获取页面是否存活状态
/// </summary> /// </summary>
/// <returns>如果页面节点有效则返回true否则返回false</returns>
public bool IsAlive => owner.IsValidNode(); public bool IsAlive => owner.IsValidNode();
/// <summary>
/// 获取页面是否可见状态
/// </summary>
/// <returns>如果页面可见则返回true否则返回false</returns>
public bool IsVisible => owner.Visible;
/// <summary> /// <summary>
/// 页面进入时调用 /// 页面进入时调用
/// </summary> /// </summary>
@ -110,9 +117,4 @@ public class CanvasItemUiPageBehavior<T>(T owner, string key) : IUiPageBehavior
/// 获取或设置页面是否阻止输入 /// 获取或设置页面是否阻止输入
/// </summary> /// </summary>
public bool BlocksInput { get; set; } = true; public bool BlocksInput { get; set; } = true;
/// <summary>
/// 获取或设置页面是否需要遮罩层
/// </summary>
public bool RequiresMask { get; set; }
} }