// 页面位置与子项插入的代码示例:Page 方法覆盖计数,Container.insert 在指定位置创建稳定子槽。 // 当前侧栏提供选择/关闭,文案中的拖放场景也可经版本化事件 API 测试;不要把它理解成已实现的侧栏拖动手势。 // 继承 Page 后观察 moveToWindow/moveTab 的真实方法调用,保留原生迁移/重排行为。 class TrackedPage: Page { // 每个 TrackedPage 引用同一 calls 状态,统计的是这两个覆盖方法的调用,不是渲染或所有页面操作次数。 calls: Object // 先递增 calls,再显式调用基类执行跨窗迁移;Page 身份保留,旧 Mount 上下文会替换。 function moveToWindow(self: TrackedPage, window: Window): Page { // 外部代码/API 选择此源覆盖时进入;显式 Page.moveToWindow 绕过再次动态分派,避免递归调用自身。 self.calls.increment() return Page.moveToWindow(self, window) } // position 是所属窗口内最终零基位置,重排不等于创建新的业务 Page。 function moveTab(self: TrackedPage, position: Number): Page { // 显式调用原生基类并返回它的 Page 结果,计数副作用不会把位置参数改成相对偏移。 self.calls.increment() return Page.moveTab(self, position) } } // 保存容器业务对象,按钮插入只改变其子槽顺序,已有 child 的槽与 Mount 尽量保留。 class Actions { list: Column // 在索引 1 前插入新 TextBlock,返回的稳定槽可供 remove 等后续操作使用。 function insert(self: Actions, event: Event): Unit { // 由 button 的 click 连接派发;索引 1 是本次调用时的位置,每次点击新建文字并插入到当前第二项之前。 self.list.insert(1, TextBlock("插入的新对象")) } } calls = ui.state(0) list = Column(0, 8, TextBlock("第一个子项"), TextBlock("最后一个子项")) // list 的可变孩子槽由同一 Column 持有,所有共享页面观察插入后的同一序列,不为各页单独执行回调。 actions = Actions(list) button = Button("在位置 1 插入 Block") connection = button.on("click", actions.insert) // A/C/目标页共享同一根及 list;各页激活时使用独立展示上下文,业务插入结果共享。 shared = Column(24, 16, TextBlock("拖动 Tab 重排、移入另一个窗口,或拖出独立窗口"), TextBlock("Page 方法调用次数"), ui.textOf(calls,"value"), button, list) first = TrackedPage(calls) first.title = "A · 共享内容" first.render(shared) second = TrackedPage(calls) second.title = "B · 单独内容" second.render(Column(24, 16, TextBlock("这是 B,Page 身份随 Tab 移动保留"))) third = TrackedPage(calls) third.title = "C · 同一对象" third.render(shared) // 建立目标窗口并指定桌面位置,MoveTo 使用物理桌面坐标且可能受窗口管理器调整。 other = Window() other.resize(720,520) other.setTitle("Tab Target") other.moveTo(1700,80) target = TrackedPage(calls) target.title = "目标窗口" target.render(shared) // 这里调用继承的 open,不直接调用上面的 moveToWindow 覆盖;不能把初始建页过程当作这两个方法的演示调用。 target.open(other) // 恢复源窗口首个页面,最后排出 resize/title/move/focus,便于手动或 API 验证。 first.activate() ui.window().resize(800,600) ui.window().setTitle("Tab Source") ui.window().moveTo(50,80) ui.window().focus()