# Fix-BUG-20260511-0011 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: Fix-BUG-20260511-0011 - 关联 BUG ID: BUG-20260511-0011 - 修复目标: 事件尾补收集跨 root dirty 子树,保证同轮托管提交 - 状态:已完成 - 负责人: Codex - 分支 / 版本: 当前工作区 ## 根因分析 - 根因: `Window::requestManagedRepaint()` 只登记当前事件链触发的 source/root;回调里直接修改其他 root 的控件时,该 root 只变 dirty,没有进入 `managedRepaintItems`。 - 触发条件: 点击一个 root 中的控件,回调修改另一个 root 下的 Label / 控件状态。 - 为什么之前没发现:[可选] 需要跨 root 回调才能稳定暴露。 - 关键证据:[可选] 下一次鼠标消息后 Label 才刷新,说明目标 root dirty 状态滞留。 ## 修复方案 - 修复思路: 在普通输入事件收口阶段、`flushManagedRepaint()` 前扫描所有顶层普通控件和可见 Dialog,发现未登记但存在 dirty 子树的 root,则补登记为托管重绘项。 - 关键改动: - 新增 `Window::collectDirtyRootsForManagedRepaint()`。 - `runEventLoop()` 在 `flushManagedRepaint()` 前调用该函数。 - 涉及文件 / 类 / 函数: - `Window.h` - `Window.cpp::collectDirtyRootsForManagedRepaint` - `Window.cpp::runEventLoop` - 影响的 API / 行为:[可选] 无公开 API 变化。 - 关键约束 / 不变量:[可选] 只处理可见 root;已登记 root 不重复登记。 - 回滚点 / 开关:[可选] 移除事件尾补收集调用。 ## 影响评估 - 影响范围: 普通输入事件尾的托管重绘收口。 - 兼容性影响:无 - 行为变化:有(跨 root dirty 会更及时刷新) - 性能影响:有(事件尾多一次顶层 dirty 子树扫描) - 回归风险: 中;如果存在历史残留 dirty,可能更早暴露重绘问题。 ## 验证结果 - 验证步骤: 1. 编译 `Window.cpp`。 2. 编译 `z-testDome.cpp /DKEY=6`。 3. 编译 `z-testDome.cpp` 的 `KEY1 ~ KEY6`。 - 验证结果: 编译通过 - 回归检查:[可选] KEY6 Right 页内按钮更新 A 区状态 Label 待用户手测 - 验证证据:[可选] ## 落地信息 - Commit: 未提交 - PR:[可选] - 发布版本:[可选] - 备注:[可选]