# UI 系统 API **本文引用的文件** - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs) - [IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs) - [IUiPageEnterParam.cs](file://GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs) - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs) - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs) - [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs) - [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs) - [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs) - [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs) - [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件为 GFramework.UI 系统的 API 参考文档,聚焦于 UI 路由与页面生命周期管理。内容覆盖: - UI 路由器接口(IUiRouter)的核心导航与守卫能力 - 基类实现(UiRouterBase)的职责与扩展点 - 页面进入参数(IUiPageEnterParam)的使用方式 - UI 过渡管道(UiTransitionPipeline)的配置项与阶段 - 过渡处理器(UiTransitionHandlerBase)扩展机制与日志处理器 - UI 页面接口(IUiPage)、UI 根节点接口(IUiRoot)的 API 说明 - 常见用例的代码示例路径(以源码路径代替具体代码) ## 项目结构 UI 相关抽象位于 GFramework.Game.Abstractions,具体实现位于 GFramework.Game;枚举类型集中于 GFramework.Game.Abstractions/enums。 ```mermaid graph TB subgraph "抽象层" A["IUiRouter 接口"] B["IUiPage 接口"] C["IUiRoot 接口"] D["IUiPageEnterParam 接口"] E["IUiTransitionHandler 接口"] F["IUiRouteGuard 接口"] G["UiTransitionType 枚举"] H["UiTransitionPolicy 枚举"] I["UITransitionPhases 枚举"] end subgraph "实现层" J["UiRouterBase 基类"] K["UiTransitionHandlerBase 基类"] L["LoggingTransitionHandler 日志处理器"] end A --> J E --> K K --> L A --> F A --> G A --> H A --> I B --> A C --> A ``` 图表来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138) - [IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs#L1-L39) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43) - [IUiPageEnterParam.cs](file://GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs#L1-L7) - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39) - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37) - [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs#L1-L27) - [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L1-L18) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27) - [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs) - [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs) - [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) 章节来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138) - [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs#L1-L27) - [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L1-L18) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27) ## 核心组件 - IUiRouter:统一的 UI 导航入口,负责页面压栈、弹栈、替换、清空、根节点绑定、守卫注册、过渡处理器注册等。 - IUiPage:页面生命周期回调,涵盖进入、退出、暂停、恢复、显示、隐藏。 - IUiRoot:UI 根容器,负责页面挂载、层级与 Z-Order 控制、可见页面查询。 - IUiPageEnterParam:页面进入参数载体接口,用于携带导航参数。 - IUiTransitionHandler:过渡处理器接口,支持阶段过滤、优先级、异步处理。 - IUiRouteGuard:路由守卫接口,支持进入/离开校验与中断策略。 - 枚举体系:UiTransitionType(Push/Pop/Replace/Clear)、UiTransitionPolicy(Exclusive/Overlay)、UITransitionPhases(BeforeChange/AfterChange/All)。 章节来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138) - [IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs#L1-L39) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43) - [IUiPageEnterParam.cs](file://GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs#L1-L7) - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39) - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37) - [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs#L1-L27) - [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L1-L18) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27) ## 架构总览 UI 路由通过 IUiRouter 协调页面行为(IUiPageBehavior),由 IUiRoot 提供容器能力。过渡事件通过 IUiTransitionHandler 的链式处理,守卫通过 IUiRouteGuard 在路由决策阶段介入。UiRouterBase 作为默认实现,封装了页面栈、根节点绑定、过渡策略与处理器注册等通用逻辑。 ```mermaid sequenceDiagram participant Caller as "调用方" participant Router as "IUiRouter 实现" participant Root as "IUiRoot" participant Guard as "IUiRouteGuard 链" participant Handler as "IUiTransitionHandler 链" Caller->>Router : "Push(uiKey, param, policy, instancePolicy)" Router->>Guard : "CanEnterAsync(uiKey, param)" alt "允许进入" Guard-->>Router : "true" Router->>Root : "AddUiPage(page, layer, order)" Router->>Handler : "BeforeChange 阶段处理" Handler-->>Router : "完成" Router->>Handler : "AfterChange 阶段处理" Handler-->>Router : "完成" Router-->>Caller : "完成" else "拦截" Guard-->>Router : "false" Router-->>Caller : "失败" end ``` 图表来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L22-L41) - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L23-L28) - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L32-L38) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L11-L23) ## 详细组件分析 ### IUiRouter:UI 路由器接口 - 栈管理 - Count:当前栈深 - PeekKey/Peek/IsTop/Contains:栈顶查询与存在性判断 - 导航操作 - Push(string uiKey, ...):按标识符压栈 - Push(IUiPageBehavior, ...):按已有页面行为压栈 - Pop(...):弹栈,支持销毁策略 - Replace(...):替换全部页面(两种重载) - Clear():清空 - 根节点与容器 - BindRoot(root):绑定 UI 根节点 - 守卫机制 - AddGuard(guard)/AddGuard():注册路由守卫 - RemoveGuard(guard):移除守卫 - 过渡处理器 - RegisterHandler(handler, options?) - UnregisterHandler(handler) 章节来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L11-L137) ### IUiPage:页面生命周期接口 - OnEnter(param?):进入时调用,参数可选 - OnExit():退出时调用 - OnPause():暂停时调用 - OnResume():恢复时调用 - OnShow():显示时调用 - OnHide():隐藏时调用 章节来源 - [IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs#L7-L39) ### IUiRoot:UI 根节点接口 - AddUiPage(child) - AddUiPage(child, layer, orderInLayer) - RemoveUiPage(child) - SetZOrder(page, zOrder) - GetVisiblePages():返回当前显示页面列表 章节来源 - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L9-L43) ### IUiPageEnterParam:页面进入参数接口 - 用途:承载页面跳转时的参数数据结构 - 说明:接口本身不定义字段,具体实现由业务定义 章节来源 - [IUiPageEnterParam.cs](file://GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs#L1-L7) ### IUiTransitionHandler:过渡处理器接口 - Priority:优先级(数值越小越先执行) - Phases:适用阶段(UITransitionPhases) - ShouldHandle(event, phases):条件过滤 - HandleAsync(event, cancellationToken):异步处理 章节来源 - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39) ### IUiRouteGuard:路由守卫接口 - Priority、CanInterrupt - CanEnterAsync(uiKey, param?):进入校验 - CanLeaveAsync(uiKey):离开校验 章节来源 - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L9-L36) ### 枚举:UiTransitionType、UiTransitionPolicy、UITransitionPhases - UiTransitionType:Push、Pop、Replace、Clear - UiTransitionPolicy:Exclusive(独占,下层 Pause+Hide)、Overlay(覆盖,仅 Pause) - UITransitionPhases:BeforeChange(可阻塞)、AfterChange(不可阻塞)、All(两者皆执行) 章节来源 - [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs#L6-L27) - [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L7-L18) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27) ### UiRouterBase:基类实现要点 - 职责概览 - 维护页面栈与当前顶层页面 - 绑定 IUiRoot 并在 Push/Pop/Replace/Clear 时协调根节点 - 应用 UiTransitionPolicy 与 UiInstancePolicy - 触发过渡事件并在 BeforeChange/AfterChange 阶段调度处理器 - 执行守卫链路(可中断) - 关键流程 - Push:校验守卫 -> 创建/复用页面 -> 添加到根节点 -> BeforeChange -> AfterChange - Pop/Replace/Clear:清理与替换策略 -> BeforeChange -> AfterChange - 扩展点 - 通过 RegisterHandler/UnregisterHandler 注入自定义处理器 - 通过 AddGuard/RemoveGuard 注入业务守卫 章节来源 - [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs) ### UiTransitionHandlerBase:过渡处理器基类 - 作用:提供 IUiTransitionHandler 的便捷实现基类 - 用法:继承后实现 ShouldHandle 与 HandleAsync,并设置 Priority 与 Phases - 与 LoggingTransitionHandler 的关系:后者是内置的日志记录处理器,可直接注册使用 章节来源 - [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs) - [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) ## 依赖关系分析 - IUiRouter 依赖 IUiRoot、IUiPage、IUiRouteGuard、IUiTransitionHandler、UiTransitionType/Policy/Phases - UiRouterBase 实现 IUiRouter,并组合上述依赖 - LoggingTransitionHandler 实现 IUiTransitionHandler,常用于 AfterChange 阶段记录日志 ```mermaid classDiagram class IUiRouter { +Count : int +BindRoot(root) +Push(...) +Pop(...) +Replace(...) +Clear() +RegisterHandler(handler, options) +UnregisterHandler(handler) +PeekKey() : string +Peek() : IUiPageBehavior +IsTop(uiKey) : bool +Contains(uiKey) : bool +AddGuard(guard) +AddGuard() +RemoveGuard(guard) } class IUiRoot { +AddUiPage(child) +AddUiPage(child, layer, orderInLayer) +RemoveUiPage(child) +SetZOrder(page, zOrder) +GetVisiblePages() : IReadOnlyList } class IUiPage { +OnEnter(param) +OnExit() +OnPause() +OnResume() +OnShow() +OnHide() } class IUiTransitionHandler { +Priority : int +Phases : UITransitionPhases +ShouldHandle(event, phases) : bool +HandleAsync(event, ct) : Task } class IUiRouteGuard { +Priority : int +CanInterrupt : bool +CanEnterAsync(uiKey, param?) : Task~bool~ +CanLeaveAsync(uiKey) : Task~bool~ } class UiRouterBase class UiTransitionHandlerBase class LoggingTransitionHandler IUiRouter <|.. UiRouterBase IUiTransitionHandler <|.. UiTransitionHandlerBase UiTransitionHandlerBase <|-- LoggingTransitionHandler IUiRouter --> IUiRoot IUiRouter --> IUiPage IUiRouter --> IUiRouteGuard IUiRouter --> IUiTransitionHandler ``` 图表来源 - [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L9-L137) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L9-L43) - [IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs#L7-L39) - [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39) - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L9-L36) - [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs) - [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs) - [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) ## 性能考量 - 页面实例策略(UiInstancePolicy):合理选择 Reuse 可降低频繁创建/销毁成本 - 过渡策略(UiTransitionPolicy):Overlay 在多层页面时减少隐藏/显示开销,但需注意资源占用 - 处理器优先级:将高频/轻量处理器置于高位,避免阻塞关键路径 - 守卫链长度:控制守卫数量与复杂度,必要时采用异步快速通道 ## 故障排查指南 - 守卫拦截导致无法进入页面 - 检查 CanEnterAsync 返回值与 CanInterrupt 设置 - 示例路径:[IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L23-L28) - 过渡卡顿或异常 - 分离 BeforeChange 中的阻塞逻辑与 AfterChange 中的非阻塞逻辑 - 示例路径:[UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L15-L21) - 页面未正确显示/隐藏 - 校验 UiTransitionPolicy 与 IUiRoot 的 AddUiPage/SetZOrder 调用 - 示例路径:[IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L11-L36) - 日志缺失 - 确认已注册 LoggingTransitionHandler 或自定义处理器 - 示例路径:[LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) 章节来源 - [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L11-L36) - [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L8-L27) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L11-L36) - [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs) ## 结论 GFramework.UI 通过清晰的接口分层与可插拔的处理器/守卫机制,提供了高扩展性的 UI 路由与页面生命周期管理方案。开发者可通过 IUiRouter 统一编排页面导航,借助 IUiTransitionHandler 与 IUiRouteGuard 实现业务解耦与可观测性增强。 ## 附录 ### 常见用例与示例路径 - 实现页面导航(Push/Pop/Replace/Clear) - 示例路径:[IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L22-L80) - 自定义过渡效果(注册处理器) - 示例路径:[IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L24-L38) - 示例路径:[UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs) - 使用页面进入参数 - 示例路径:[IUiPageEnterParam.cs](file://GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs#L1-L7) - 示例路径:[IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L26-L30) - 处理页面生命周期 - 示例路径:[IUiPage.cs](file://GFramework.Game.Abstractions/ui/IUiPage.cs#L9-L38) - 绑定 UI 根节点与层级控制 - 示例路径:[IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L11-L36) - 注册路由守卫 - 示例路径:[IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L16-L20) - 示例路径:[IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L118-L135) - 日志记录处理器 - 示例路径:[LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs)