// 两个原生窗口共用一个 Aster VM 和 count 业务对象,各自拥有独立 Page 与 Mount。 // 任一窗口点击都修改同一计数,两个 textOf 显示随之更新。关闭窗口解除 Page 归属,持有的业务对象仍可重开。 // 跨窗共享的是业务对象,不是某个窗口中的具体 Mount。 // 唯一计数来源;两个按钮直接使用同一零参数原生 increment 方法。 count = ui.state(0) // 左右按钮是两个视觉对象,连接的却是绑定同一 count 的原生零参 increment 方法。 leftButton = Button("共享计数 +1") leftConnection = leftButton.on("click",count.increment) // 先在主窗口建立页面,render 默认选择该页并挂载它的内容。 left = Page() left.title = "主窗口页面" // 此次 textOf 建立左侧文字绑定,右页还会建立另一个;计数业务状态仍只有上面一份。 left.render(Column(24,16,TextBlock("两个窗口操作同一个计数对象"),ui.textOf(count,"value"),leftButton)) // Window() 分配同 VM 中的独立窗口资源,不创建第二个运行时。 other = Window() // 新窗口资源不改变 rightButton 回调的业务接收者;从哪个窗口点击都只增加同一个 count.value。 rightButton = Button("另一个窗口 +1") rightConnection = rightButton.on("click",count.increment) right = Page() right.title = "独立窗口页面" right.render(Column(24,16,TextBlock("关闭窗口会解除 Page 归属,保留的对象仍可重开"),ui.textOf(count,"value"),rightButton)) // 把页面放到 other,上下文更换将重建出现位置,业务 count 仍不变。 right.open(other) // open 把 right 归入副窗口;下面 ui.window() 仍用于源会话的主窗口,other 则显式选中副窗口资源。 // 窗口命令针对各自资源编号排队;成功输入后再交 GUI,另一窗口设置自己的尺寸。 ui.window().setTitle("Endor Main") other.setTitle("Endor Shared") other.resize(960,640)