# UI系统
**本文引用的文件**
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.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)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs)
- [UiLayer.cs](file://GFramework.Game.Abstractions/enums/UiLayer.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)
- [UiPopPolicy.cs](file://GFramework.Game.Abstractions/ui/UiPopPolicy.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向GFramework UI系统,围绕页面栈管理、路由规则与生命周期、过渡管道与动画控制、处理器模式与日志记录、以及接口设计与使用方法进行系统化说明。重点涵盖:
- UiRouterBase 的页面栈管理机制(导航、路由规则、生命周期)
- UiTransitionPipeline 的过渡管道实现(阶段、超时、错误处理)
- UiTransitionHandlerBase 及其派生类(LoggingTransitionHandler 的日志记录)
- IUiRouter 接口的设计理念与使用方法(注册、参数传递、导航控制)
- UI系统配置选项、API参考与实践建议
## 项目结构
UI系统主要分布在以下模块:
- GFramework.Game.Abstractions:定义UI抽象接口与枚举(IUiRouter、IUiPageBehavior、IUiRoot、IUiTransitionHandler、IUiRouteGuard、UiLayer、UiTransitionType、UiTransitionPolicy、UITransitionPhases、UiPopPolicy)
- GFramework.Game:具体实现(UiRouterBase、UiTransitionPipeline、UiTransitionHandlerBase、LoggingTransitionHandler)
```mermaid
graph TB
subgraph "抽象层"
A["IUiRouter 接口"]
B["IUiPageBehavior 接口"]
C["IUiRoot 接口"]
D["IUiTransitionHandler 接口"]
E["IUiRouteGuard 接口"]
F["UiLayer 枚举"]
G["UiTransitionType 枚举"]
H["UiTransitionPolicy 枚举"]
I["UITransitionPhases 枚举"]
J["UiPopPolicy 枚举"]
end
subgraph "实现层"
K["UiRouterBase 实现"]
L["UiTransitionPipeline 实现"]
M["UiTransitionHandlerBase 抽象基类"]
N["LoggingTransitionHandler 具体处理器"]
end
A --> K
B --> K
C --> K
D --> L
E --> K
F --> K
G --> K
H --> K
I --> L
J --> K
M --> L
N --> M
```
图表来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37)
- [UiLayer.cs](file://GFramework.Game.Abstractions/enums/UiLayer.cs#L1-L34)
- [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)
- [UiPopPolicy.cs](file://GFramework.Game.Abstractions/ui/UiPopPolicy.cs#L1-L17)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
章节来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
- [UiLayer.cs](file://GFramework.Game.Abstractions/enums/UiLayer.cs#L1-L34)
- [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)
- [UiPopPolicy.cs](file://GFramework.Game.Abstractions/ui/UiPopPolicy.cs#L1-L17)
## 核心组件
- IUiRouter:统一的UI路由入口,提供页面栈管理、层级管理、路由守卫、处理器注册等能力
- UiRouterBase:IUiRouter的具体实现,内置页面栈、层级字典、过渡管道与守卫执行逻辑
- UiTransitionPipeline:过渡阶段的处理器管道,支持按阶段过滤、排序、超时与错误控制
- UiTransitionHandlerBase:处理器抽象基类,提供默认实现与可覆写钩子
- LoggingTransitionHandler:内置日志处理器,记录UI切换事件的关键信息
- IUiPageBehavior/IUiRoot:页面行为与根容器接口,定义生命周期与容器操作
- IUiRouteGuard:路由守卫接口,提供进入/离开校验与中断能力
- 枚举体系:UiLayer、UiTransitionType、UiTransitionPolicy、UITransitionPhases、UiPopPolicy
章节来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37)
- [UiLayer.cs](file://GFramework.Game.Abstractions/enums/UiLayer.cs#L1-L34)
- [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)
- [UiPopPolicy.cs](file://GFramework.Game.Abstractions/ui/UiPopPolicy.cs#L1-L17)
## 架构总览
UI系统采用“接口抽象 + 具体实现 + 管道扩展”的分层设计:
- 抽象层定义路由、页面、根容器、处理器、守卫与枚举
- 实现层提供具体的路由栈管理、层级管理、过渡管道与处理器基类
- 管道通过阶段化扩展点(BeforeChange/AfterChange)解耦业务逻辑与UI切换
```mermaid
classDiagram
class IUiRouter {
+int Count
+void BindRoot(root)
+void Push(uiKey, param, policy, instancePolicy)
+void Push(page, param, policy)
+void Pop(policy)
+void Replace(uiKey, param, popPolicy, pushPolicy, instancePolicy)
+void Replace(page, param, popPolicy, pushPolicy)
+void Clear()
+void RegisterHandler(handler, options)
+void UnregisterHandler(handler)
+string PeekKey()
+IUiPageBehavior Peek()
+bool IsTop(uiKey)
+bool Contains(uiKey)
+void AddGuard(guard)
+void AddGuard~T~()
+void RemoveGuard(guard)
}
class UiRouterBase {
-Stack~IUiPageBehavior~ _stack
-Dictionary~UiLayer, Dictionary~string, IUiPageBehavior~~ _layers
-UiTransitionPipeline _pipeline
-IUiRouteGuard[] _guards
-IUiFactory _factory
-IUiRoot _uiRoot
+void RegisterHandlers()
+void BeforeChange(event)
+void AfterChange(event)
+void DoPushPageInternal(...)
+void DoPopInternal(policy)
+void DoClearInternal(policy)
+void Show(uiKey, layer, param, instancePolicy)
+void Show(page, layer)
+void Hide(uiKey, layer, destroy)
+void ClearLayer(layer, destroy)
+IUiPageBehavior GetFromLayer(uiKey, layer)
+bool HasVisibleInLayer(layer)
+Task~bool~ ExecuteEnterGuardsAsync(uiKey, param)
+Task~bool~ ExecuteLeaveGuardsAsync(uiKey)
}
class IUiTransitionHandler {
+int Priority
+UITransitionPhases Phases
+bool ShouldHandle(event, phases)
+Task HandleAsync(event, token)
}
class UiTransitionHandlerBase {
+virtual UITransitionPhases Phases
+abstract int Priority
+virtual bool ShouldHandle(event, phases)
+abstract Task HandleAsync(event, token)
}
class LoggingTransitionHandler {
+override int Priority
+override UITransitionPhases Phases
+override Task HandleAsync(event, token)
}
class UiTransitionPipeline {
-IUiTransitionHandler[] _handlers
-Dictionary~IUiTransitionHandler, UiTransitionHandlerOptions~ _options
+void RegisterHandler(handler, options)
+void UnregisterHandler(handler)
+Task ExecuteAsync(event, phases, token)
}
class IUiPageBehavior {
+object View
+string Key
+bool IsAlive
+void OnEnter(param)
+void OnExit()
+void OnPause()
+void OnResume()
+void OnHide()
+void OnShow()
+bool IsModal
+bool BlocksInput
+bool RequiresMask
}
class IUiRoot {
+void AddUiPage(child)
+void AddUiPage(child, layer, orderInLayer)
+void RemoveUiPage(child)
+void SetZOrder(page, zOrder)
+IReadOnlyList~IUiPageBehavior~ GetVisiblePages()
}
IUiRouter <|.. UiRouterBase
UiRouterBase --> UiTransitionPipeline : "使用"
UiRouterBase --> IUiPageBehavior : "管理"
UiRouterBase --> IUiRoot : "绑定"
IUiTransitionHandler <|.. UiTransitionHandlerBase
UiTransitionHandlerBase <|-- LoggingTransitionHandler
UiTransitionPipeline --> IUiTransitionHandler : "调度"
```
图表来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
## 详细组件分析
### 页面栈管理与生命周期(UiRouterBase)
- 页面栈管理
- Push:支持基于 uiKey 或已有 IUiPageBehavior 的压入;可选过渡策略与实例策略
- Pop:支持销毁或缓存策略;执行离开守卫后再弹出
- Replace:清空栈后压入新页面;支持基于 uiKey 或实例
- Clear:清空所有页面
- Peek/PeekKey/IsTop/Contains/Count:查询栈状态
- 生命周期与过渡策略
- Exclusive:下层页面 Pause + Hide;覆盖显示时仅 Pause
- Overlay:下层页面仅 Pause,不隐藏
- OnEnter/OnExit/OnPause/OnResume/OnHide/OnShow:页面生命周期回调
- 层级管理(非栈)
- Show/Hide/ClearLayer:在 Overlay/Modal/Toast/Topmost 等层级显示/隐藏/清空
- 支持实例复用与缓存
- 路由守卫
- AddGuard/RemoveGuard;Enter/Leave 双向守卫;支持 CanInterrupt 与优先级排序
- 处理器注册
- RegisterHandler/UnregisterHandler;OnInit 中注册默认处理器
```mermaid
flowchart TD
Start(["开始 Push(uiKey)"]) --> Guard["执行进入守卫"]
Guard --> GuardOK{"守卫通过?"}
GuardOK --> |否| Abort["终止 Push 并记录日志"]
GuardOK --> |是| GetOrCreate["工厂获取/创建页面实例"]
GetOrCreate --> CurrentTop{"是否存在栈顶页面?"}
CurrentTop --> |是| Pause["栈顶 OnPause"]
Pause --> Policy{"过渡策略?"}
Policy --> |Exclusive| Hide["栈顶 OnHide"]
Policy --> |Overlay| ResumeOnly["仅 Pause"]
CurrentTop --> |否| NoAction["无需处理下层"]
Hide --> AddRoot["UiRoot.AddUiPage(page)"]
ResumeOnly --> AddRoot
NoAction --> AddRoot
AddRoot --> PushStack["压入栈"]
PushStack --> EnterShow["page.OnEnter(param)
page.OnShow()"]
EnterShow --> End(["结束"])
```
图表来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L369-L420)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L27-L55)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L1-L18)
章节来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L70-L254)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L369-L420)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L422-L474)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L476-L604)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L607-L722)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs#L1-L18)
### 过渡管道(UiTransitionPipeline)
- 管道职责
- 按阶段(BeforeChange/AfterChange/All)过滤与排序处理器
- 支持单个处理器超时与取消令牌组合
- 错误处理:ContinueOnError 控制是否中断管道
- 执行流程
- BeforeChange:阻塞式执行,适合需要等待的前置动作(动画、确认、预加载)
- AfterChange:非阻塞式执行,适合后台统计、日志、音效等
- 处理器注册与去注册
- RegisterHandler/UnregisterHandler;重复注册会忽略并记录日志
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Router as "UiRouterBase"
participant Pipeline as "UiTransitionPipeline"
participant Handler as "IUiTransitionHandler"
Caller->>Router : "Push/Pop/Replace/Clear"
Router->>Router : "BeforeChange 事件"
Router->>Pipeline : "ExecuteAsync(event, BeforeChange)"
Pipeline->>Handler : "HandleAsync(event, token)"
Handler-->>Pipeline : "完成/超时/异常"
Pipeline-->>Router : "完成"
Router->>Router : "Do*Internal 执行页面操作"
Router->>Pipeline : "ExecuteAsync(event, AfterChange)"
Pipeline->>Handler : "HandleAsync(event, token)"
Handler-->>Pipeline : "完成"
Pipeline-->>Router : "完成"
Router-->>Caller : "返回"
```
图表来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L339-L364)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L63-L101)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27)
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L339-L364)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27)
### 处理器模式与日志记录(UiTransitionHandlerBase / LoggingTransitionHandler)
- UiTransitionHandlerBase
- 默认处理所有阶段(Phases=All),默认 ShouldHandle 返回 true
- Priority 由子类实现;HandleAsync 由子类实现
- LoggingTransitionHandler
- 高优先级(Priority=999),记录切换阶段、类型、来源/目标、策略
- 作为内置日志处理器,便于调试与审计
```mermaid
classDiagram
class UiTransitionHandlerBase {
+virtual Phases : UITransitionPhases
+abstract Priority : int
+virtual ShouldHandle(event, phases) bool
+abstract HandleAsync(event, token) Task
}
class LoggingTransitionHandler {
+override Priority : int
+override Phases : UITransitionPhases
+override HandleAsync(event, token) Task
}
UiTransitionHandlerBase <|-- LoggingTransitionHandler
```
图表来源
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27)
章节来源
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
### IUiRouter 接口设计与使用
- 设计理念
- 统一入口:IUiRouter 提供 Push/Pop/Replace/Clear 与层级管理、守卫、处理器注册
- 解耦:通过管道与守卫将业务逻辑与UI切换解耦
- 可扩展:通过处理器与守卫扩展能力
- 使用要点
- 绑定根节点:BindRoot(IUiRoot)
- 注册处理器:RegisterHandler(handler, options)
- 注册守卫:AddGuard/generic AddGuard()
- 导航控制:Push/Pop/Replace/Clear;层级管理:Show/Hide/ClearLayer
- 参数传递:IUiPageEnterParam 作为进入参数载体
章节来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L66-L61)
## 依赖关系分析
- 组件耦合
- UiRouterBase 依赖 IUiFactory(通过系统工具获取)、IUiRoot、IUiPageBehavior、UiTransitionPipeline、IUiRouteGuard
- UiTransitionPipeline 依赖 IUiTransitionHandler 与 UiTransitionHandlerOptions
- 关键依赖链
- IUiRouter → UiRouterBase → UiTransitionPipeline → IUiTransitionHandler
- UiRouterBase → IUiRoot → IUiPageBehavior
- UiRouterBase → IUiRouteGuard(守卫链)
```mermaid
graph LR
IUiRouter --> UiRouterBase
UiRouterBase --> UiTransitionPipeline
UiRouterBase --> IUiRoot
UiRouterBase --> IUiPageBehavior
UiRouterBase --> IUiRouteGuard
UiTransitionPipeline --> IUiTransitionHandler
```
图表来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37)
章节来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L1-L725)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
## 性能考虑
- 页面实例管理
- Reuse/Cache 策略:在 Replace/Push/Pop 中合理选择实例策略,减少频繁创建/销毁
- 层级管理:Overlay/Modal/Toast 等非栈层级避免与页面栈混用,降低复杂度
- 过渡管道
- BeforeChange 阶段避免长时间阻塞;必要时拆分为多个短任务
- AfterChange 阶段执行非关键后台任务,避免影响主线程
- 合理设置处理器超时与 ContinueOnError,防止单个处理器拖慢整体
- 日志与可观测性
- LoggingTransitionHandler 仅作调试用途,生产环境建议降低日志级别或禁用
- 动画与渲染
- 过渡策略 Exclusive 会隐藏下层页面,Overlay 仅 Pause;根据场景选择合适策略
- 避免在 OnShow/OnHide 中执行高成本同步操作
## 故障排查指南
- 常见问题
- Push 被忽略:若目标页面已在栈顶,将直接忽略并记录警告
- Pop 被守卫阻止:离开守卫返回 false 或抛出异常将阻止弹出
- 处理器超时:UiTransitionHandlerOptions.TimeoutMs 设置过短可能导致超时中断
- AfterChange 异常:异常会被捕获并记录,但不会中断管道(除非 ContinueOnError=false)
- 排查步骤
- 检查守卫优先级与 CanInterrupt 设置
- 查看 BeforeChange/AfterChange 阶段日志
- 确认处理器注册顺序与过滤条件(ShouldHandle)
- 验证页面生命周期回调是否正确实现
章节来源
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L84-L88)
- [UiRouterBase.cs](file://GFramework.Game/ui/UiRouterBase.cs#L148-L152)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L125-L167)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L34-L47)
## 结论
GFramework UI系统通过清晰的接口抽象与实现分离,提供了强大的页面栈管理、层级管理、路由守卫与过渡管道能力。UiRouterBase 作为核心控制器,结合 UiTransitionPipeline 的阶段化扩展点,实现了业务逻辑与UI切换的解耦;LoggingTransitionHandler 提供了开箱即用的日志能力。遵循本文的最佳实践与性能建议,可在保证体验的同时提升系统的可维护性与稳定性。
## 附录
### API 参考(摘要)
- IUiRouter
- Push/Pop/Replace/Clear:页面导航与栈操作
- Show/Hide/ClearLayer:层级管理
- RegisterHandler/UnregisterHandler:处理器注册
- AddGuard/RemoveGuard:路由守卫注册
- IUiTransitionHandler
- Priority/Phases/ShouldHandle/HandleAsync:处理器契约
- IUiRouteGuard
- Priority/CanInterrupt/CanEnterAsync/CanLeaveAsync:守卫契约
- IUiPageBehavior
- OnEnter/OnExit/OnPause/OnResume/OnHide/OnShow:生命周期
- IUiRoot
- AddUiPage/RemoveUiPage/SetZOrder/GetVisiblePages:容器操作
- 枚举
- UiLayer:Page/Overlay/Modal/Toast/Topmost
- UiTransitionType:Push/Pop/Replace/Clear
- UiTransitionPolicy:Exclusive/Overlay
- UITransitionPhases:BeforeChange/AfterChange/All
- UiPopPolicy:Destroy/Cache
章节来源
- [IUiRouter.cs](file://GFramework.Game.Abstractions/ui/IUiRouter.cs#L1-L138)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [IUiRouteGuard.cs](file://GFramework.Game.Abstractions/ui/IUiRouteGuard.cs#L1-L37)
- [IUiPageBehavior.cs](file://GFramework.Game.Abstractions/ui/IUiPageBehavior.cs#L1-L72)
- [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43)
- [UiLayer.cs](file://GFramework.Game.Abstractions/enums/UiLayer.cs#L1-L34)
- [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)
- [UiPopPolicy.cs](file://GFramework.Game.Abstractions/ui/UiPopPolicy.cs#L1-L17)