HarmonyOS 子窗口如何通过router.push()在主窗口打开页面

主页面A启动了子窗口,子窗口的页面通过router跳转到B页面,会导致子窗口中的页面加载新的页面B。期望在子窗口中通过router跳转能使主窗口加载到B页面,应该如何实现?

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fox280

参考示例如下:

this.windowStage.getMainWindowSync()
  .getUIContext()
  .getRouter()
  .pushUrl({ url: "pages/routerPage" }, router.RouterMode.Single);

1、EntryAbility页面

onWindowStageCreate(windowStage: window.WindowStage): void {
  // Main window is created, set main page for this ability
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

  windowStage.loadContent('pages/Index', (err, data) => {
  if (err.code) {
    hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
    return;
    }
  AppStorage.setOrCreate("windowStage", windowStage);
  hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
  });
}

2、主窗口页面

@State windowStage: window.WindowStage = AppStorage.get("windowStage") as window.WindowStage
        
.onClick(() => {
  this.windowStage.createSubWindow("mySubWindow", (err, windowClass) => {
    if (err.code > 0) {
      console.error("failed to create subWindow Cause:" + err.message)
      return;
    }
    // 设置子窗口加载页
    try {
      windowClass.setUIContent("pages/subPage", () => {
        windowClass.setWindowBackgroundColor("#00000000")
      });
      // 设置子窗口左上角坐标
      windowClass.moveWindowTo(0, 200)
      // 设置子窗口大小
      windowClass.resize(vp2px(300), vp2px(300))
      // 展示子窗口
      windowClass.showWindow();
      // 设置子窗口全屏化布局不避让安全区
      windowClass.setWindowLayoutFullScreen(true);
    } catch (err) {
      console.error("failed to create subWindow Cause:" + err)
    }
  })
})

3、子窗口页面

Button("跳转")
  .onClick(() => {
    // 获取子窗口ID
    let subWindowID: number = window.findWindow("mySubWindow").getWindowProperties().id
    // 获取主窗口ID
    let mainWindowID: number = this.windowStage.getMainWindowSync().getWindowProperties().id
    // 将焦点从子窗口转移到主窗口
    let promise = window.shiftAppWindowFocus(subWindowID, mainWindowID);
    promise.then(() => {
      console.info('Succeeded in shifting app window focus');
    }).catch((err: BusinessError) => {
      console.error('Failed to shift app window focus. Cause: ' + JSON.stringify(err));
    })
    this.windowStage.getMainWindowSync()
      .getUIContext()
      .getRouter()
      .pushUrl({ url: "pages/routerPage" }, router.RouterMode.Single);
  })

4、跳转窗口页面

@Entry
@Component
struct RouterPage {
  @State message: string = 'RouterPage';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
    .backgroundColor(Color.Pink)
  }
}
分享
微博
QQ
微信
回复
2天前
相关问题
如何通过代码关闭窗口
602浏览 • 1回复 待解决
HarmonyOS 窗口获取
137浏览 • 1回复 待解决
Navigator和router.push有啥区别?
4646浏览 • 1回复 待解决
如何获取窗口window的宽度
2195浏览 • 1回复 待解决
HarmonyOS 如何拖拽窗口
133浏览 • 1回复 待解决
HarmonyOS 窗口页面返回事件无效
149浏览 • 1回复 待解决
HarmonyOS 窗口跳转页面的返回问题
401浏览 • 1回复 待解决
如何实现一个页面显示窗口
834浏览 • 1回复 待解决
如何获取WindowStage实例下的窗口
603浏览 • 1回复 待解决