ArkUI-Navigation

鸿蒙5.0开发:ArkUI组件(Navigation) Navigation组件通常作为页面的根容器,支持单页面、分栏和自适应三种显示模式。 阅读详情

Navigation是路由容器组件,一般作为首页的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,一次开发,多段部署场景。通过组件级路由能力实现更加自燃流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。在不同尺寸的设备上,Navigation组件能够自适应显示大小,自动切换分栏展示效果。

Navigation组件主要包含导航页(NavBar)和子页(NavDestination)。导航页由标题栏(Titlebar,包含菜单栏menu)、内容器(Navigation子组件)和工具栏(Toolsbar)组成。其中导航页可以通过hideNavBar属性进行隐藏,导航页不存在页面栈中,导航页和子页,以及子页之间可以通过路由(NavPathStack)操作进行切换。

设置页面显示模式

Navigation组件通过mode属性设置页面的显示模式。

自适应模式

Navigation组件默认为自适应模式,此时mode属性为NavigationMode.Auto。自适应模式下,当前页面宽度大于等于一定的阈值时,Navigation组件采用分栏模式,反之采用单栏模式。

单页面模式

将mode属性设置为NavigationMode.Stack,Navigation组件即可设置为单页面显示模式。
在这里插入图片描述

分栏模式

将mode属性设置为NavigationMode.Split,Navigation组件即可设置为分栏显示模式。
在这里插入图片描述

用法示例:

@Entry
@Component
struct NavigationExample {
  @State TooTmp: ToolbarItem = {'value': "func", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()
  private arr: number[] = [1, 2, 3];

  @Builder
  PageMap(name: string) {
    if (name === "NavDestinationTitle1") {
      pageOneTmp()
    } else if (name === "NavDestinationTitle2") {
      pageTwoTmp()
    } else if (name === "NavDestinationTitle3") {
      pageThreeTmp()
    }
  }

  build() {
    Column() {
      Navigation(this.pageInfos) {
        TextInput({ placeholder: 'search...' })
          .width("90%")
          .height(40)
          .backgroundColor('#FFFFFF')

        List({ space: 12 }) {
          ForEach(this.arr, (item:string) => {
            ListItem() {
              Text("NavRouter" + item)
                .width("100%")
                .height(72)
                .backgroundColor('#FFFFFF')
                .borderRadius(24)
                .fontSize(16)
                .fontWeight(500)
                .textAlign(TextAlign.Center)
                .onClick(()=>{
                  this.pageInfos.pushPath({ name: "NavDestinationTitle" + item})
                })
            }
          }, (item:string):string => item)
        }
        .width("90%")
        .margin({ top: 12 })
      }
      .title("主标题")
      .mode(NavigationMode.Split)
      .navDestination(this.PageMap)
      .menus([
        {value: "", icon: "./image/ic_public_search.svg", action: ()=> {}},
        {value: "", icon: "./image/ic_public_add.svg", action: ()=> {}},
        {value: "", icon: "./image/ic_public_add.svg", action: ()=> {}},
        {value: "", icon: "./image/ic_public_add.svg", action: ()=> {}},
        {value: "", icon: "./image/ic_public_add.svg", action: ()=> {}}
      ])
      .toolbarConfiguration([this.TooTmp, this.TooTmp, this.TooTmp])
    }
    .height('100%')
    .width('100%')
    .backgroundColor('#F1F3F5')
  }
}

// PageOne.ets
@Component
export struct pageOneTmp {
  @Consume('pageInfos') pageInfos: NavPathStack;
  build() {
    NavDestination() {
      Column() {
        Text("NavDestinationContent1")
      }.width('100%').height('100%')
    }.title("NavDestinationTitle1")
    .onBackPressed(() => {
      const popDestinationInfo = this.pageInfos.pop() // 弹出路由栈栈顶元素
      console.log('pop' + '返回值' + JSON.stringify(popDestinationInfo))
      return true
    })
  }
}

// PageTwo.ets
@Component
export struct pageTwoTmp {
  @Consume('pageInfos') pageInfos: NavPathStack;
  build() {
    NavDestination() {
      Column() {
        Text("NavDestinationContent2")
      }.width('100%').height('100%')
    }.title("NavDestinationTitle2")
    .onBackPressed(() => {
      const popDestinationInfo = this.pageInfos.pop() // 弹出路由栈栈顶元素
      console.log('pop' + '返回值' + JSON.stringify(popDestinationInfo))
      return true
    })
  }
}

// PageThree.ets
@Component
export struct pageThreeTmp {
  @Consume('pageInfos') pageInfos: NavPathStack;
  build() {
    NavDestination() {
      Column() {
        Text("NavDestinationContent3")
      }.width('100%').height('100%')
    }.title("NavDestinationTitle3")
    .onBackPressed(() => {
      const popDestinationInfo = this.pageInfos.pop() // 弹出路由栈栈顶元素
      console.log('pop' + '返回值' + JSON.stringify(popDestinationInfo))
      return true
    })
  }
}

在这里插入图片描述

设置标题栏模式

标题栏在界面顶部,用于呈现界面名称和操作入口,Navigation组件通过titleMode属性设置标题栏模式。

  • Mini模式:普通型标题栏,用于一级页面不需要突出标题的场景。
  • Full模式:强调型标题栏,用于一级页面需要突出标题的场景。
Navigation() {
  ...
}
.titleMode(NavigationTitleMode.Full)

设置菜单栏

菜单栏位于Navigation组件的右上角,通过menus属性进行设置。menus支持Array<NavigationMenuItem>和CustomBuilder两种参数类型。使用Array<NavigationMenuItem>类型时,竖屏最多支持显示3个图标,横屏最多支持显示5个图标,多余的图标会被放入自动生成的更多图标中。

设置了三个图标

let TooTmp: NavigationMenuItem = {'value': "", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
Navigation() {
  ...
}
.menus([TooTmp,
  TooTmp,
  TooTmp])

在这里插入图片描述

设置了4个图标

let TooTmp: NavigationMenuItem = {'value': "", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
Navigation() {
  ...
}
.menus([TooTmp,
  TooTmp,
  TooTmp,
  TooTmp])

在这里插入图片描述

设置工具栏

工具栏位于Navigation组件的地步,可以通过toolbarConfigation属性进行设置。

let TooTmp: ToolbarItem = {'value': "func", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
let TooBar: ToolbarItem[] = [TooTmp,TooTmp,TooTmp]
Navigation() {
  ...
}
.toolbarConfiguration(TooBar)

在这里插入图片描述

路由操作

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要传入一个NavPathStack对象, 用于页面管理。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。

@Entry
@Component
struct Index {
  // 创建一个页面栈对象并传入Navigation
  pageStack: NavPathStack = new NavPathStack()

  build() {
    Navigation(this.pageStack) {
    }
    .title('Main')
  }
}

页面跳转

NavPathStack通过push相关接口实现页面跳转的功能,主要分为以下三类

  1. 普通跳转,通过页面的name进行跳转,并且可以携带param。
    this.pageStack.pushPath({ name: "PageOne", param: "PageOne Param" })
    this.pageStack.pushPathByName("PageOne", "PageOne Param")
    
  2. 带返回回调的跳转,跳转时添加onPop回调,能在页面出栈时获取返回信息,并进行处理。
    this.pageStack.pushPathByName('PageOne', "PageOne Param", (popInfo) => {
    console.log('Pop page name is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result))
    });
    
  3. 带错误码的跳转,跳转结束会触发异步回调,返回错误码信息。
    this.pageStack.pushDestinationByName('PageOne', "PageOne Param")
    .catch((error: BusinessError) => {
        console.error(`Push destination failed, error code = ${error.code}, error.message = ${error.message}.`);
    }).then(() => {
    console.error('Push destination succeed.');
    });
    

页面返回

NavPathStack通过pop相关接口去实现页面返回功能

//返回上一页
this.pageStack.pop()
//返回到上一个PageOne页面
this.pageStack.popToName("PageOne")
//返回到索引值为1的页面
this.pageStack.popToIndex(1)
//返回到根首页
this.pageStack.clear()

页面替换

NavPathStack通过replace相关接口实现页面替换功能

//将栈顶页面替换为PageOne
this.pageStack.replacePath({name:"PageOne",param:"PageOne Param"})
this.pageStack.replacePathByName("PageOne","PageOne Param")

页面删除

NavPathStack通过remove相关接口实现删除页面栈中指定页面的功能

//删除栈中name为PageOne的所有页面
this.pageStack.removeByName("PageOne")
//删除栈中指定索引值的页面
this.pageStack.removeByIndexes([1,3,5])

参数获取

NavPathStack通过get相关接口获取页面的参数

//获取栈中所有页面name集合
this.pageStack.getAllPathName()
//获取索引值为1的页面参数
this.pageStack.getParamByIndex(1)
//获取PageOne页面的参数
this.pageStack.getParamByName("PageOne")
//获取PageOne页面的索引集合
this.pageStack.getIndexByName("PageOne")

路由拦截

NavPathStack提供了setInterception方法,用于设置Navigation页面跳转的拦截回调。该方法需要传入一个NavigationInterception对象,该对象包括三个回调

  • willShow:页面跳转前回调,允许操作栈,在当前跳转生效。
  • didShow:页面跳转后回调,在该回调中操作栈,将在下一次跳转生效
  • modeChange:Navigation单双栏显示状态发生变化时触发。

无论是那个回调,在进去回调时页面栈都已经发生了变化。

可以在willShow回调中修改路由栈来实现路由拦截重定向的能力。

this.pageStack.setInterception({
  willShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",
    operation: NavigationOperation, animated: boolean) => {
    if (typeof to === "string") {
      console.log("target page is navigation home page.");
      return;
    }
    // 将跳转到PageTwo的路由重定向到PageOne
    let target: NavDestinationContext = to as NavDestinationContext;
    if (target.pathInfo.name === 'PageTwo') {
      target.pathStack.pop();
      target.pathStack.pushPathByName('PageOne', null);
    }
  }
})

子页面

NavDestination是Navigation子页面的根容器,用于承载子页面的一些特殊属性以及生命周期等。
NavDestination可以设置独立的标题栏和菜单栏等属性,使用方法与Navigation相同。NavDestination也可以通过mode属性设置不同的显示类型。

页面显示类型

标准类型

NavDestination组件默认是标准类型,此时mode属性为NavDestinationMode.STANDARD,标准类型的NavDestination的生命周期跟随其在NavPathStack页面栈中的位置变化而变化。

弹窗类型

NavDestination设置mode为NavDestinationMode.DIALOG弹窗类型,此时整个NavDestination默认透明显示。弹窗类型的NavDestination显示和消失不会影响下层标准类型的NavDestination的显示和生命周期,两者可以同时显示。

页面生命周期

Navigation作为路由容器,其生命周期承载在NavDestination组件上,以组件时间的形式开放。

大致可以分类三类,自定义组件生命周期、通用组件生命周期和自有生命周期。

其中aboutToAppear和aboutToDisappear是自定义组件的生命周期,如果NavDestination外层包含自定义组件时则存在。

OnAppear和OnDisappear是组件的通用生命周期。

生命周期时序图如下

在这里插入图片描述

  • aboutToAppear:在创建自定义组建后,执行其build()函数之前执行(NavDestination创建之前),允许在该方法中改变状态变量,更改将在后续执行的build函数中生效。
  • onWillAppear:NavDestination创建后,挂载到组件树之前执行,在该方法中更改状态变量会在当前帧显示生效。
  • onAppear:通用生命周期事件,NavDestination组件挂载到组件树时执行。
  • onWIllShow:NavDestination组件在布局之前执行,此时页面不可见(应用切换到前台不会触发该方法)。
  • onShow:NavDestination组件布局显示之后执行。
  • onWillHidden:NavDestination组件触发隐藏之前执行(应用切换到后台不会执行)。
  • onHidden:NavDestination组件触发隐藏后执行(非栈顶页面push进栈,栈顶页面pop出栈,应用切换到后台)
  • onWillDisappear:NavDestination组件即将销毁之前执行,如果有转场动画,会在动画之前触发。
  • onDisappear:通用生命周期事件,NavDestination组件从组件树上卸载销毁时执行。
  • aboutToDisappear:自定义组件销毁之前执行,不允许在该方法中改变状态变量。

页面监听和查询

为了方便组件和页面解耦,在NavDestination子页面内部的自定义组件可以通过全局方法监听或者查询到页面的一些状态信息。

页面信息查询

自定义组件提供queryNavDestinationInfo方法,可以在NavDestination内部查询到当前所属页面的信息,返回值为NavDestinationInfo,如果查询不到则返回undefined。

 import { uiObserver } from '@kit.ArkUI';

 // NavDestination内的自定义组件
 @Component
 struct MyComponent {
   navDesInfo: uiObserver.NavDestinationInfo | undefined

   aboutToAppear(): void {
     this.navDesInfo = this.queryNavDestinationInfo();
   }

   build() {
       Column() {
         Text("所属页面Name: " + this.navDesInfo?.name)
       }.width('100%').height('100%')
   }
 }

页面状态监听

通过observer.on('navDestinationUpdate')提供的注册接口可以注册NavDestination生命周期变化的监听。

uiObserver.on('navDestinationUpdate', (info) => {
     console.info('NavDestination state update', JSON.stringify(info));
 });

也可以注册页面切换的状态回调,能在页面发生路由切换的时候拿到对应的页面信息NavDestinationSwitchInfo,并且提供了UIAbilityContext和UIContext不同范围的监听

 // 在UIAbility中使用
 import { UIContext, uiObserver } from '@kit.ArkUI';

 // callBackFunc 是自定义的监听回调函数
 function callBackFunc(info: uiObserver.NavDestinationSwitchInfo) {}
 uiObserver.on('navDestinationSwitch', this.context, callBackFunc);

 // 可以通过窗口的getUIContext()方法获取对应的UIContent
 uiContext: UIContext | null = null;
 uiObserver.on('navDestinationSwitch', this.uiContext, callBackFunc);

页面转场

Navigation默认提供了页面的转场动画,通过页面栈操作时,会触发不同的转场效果(Dialog类型的页面默认无转场动画),Navigation也提供了关闭转动动画、自定义转场以及共享元素转场的能力。

关闭转场

全局变比

Navigation通过NavPathStack中的disableAnination方法可以在当前Navigation中关闭或者打开所有转场动画。

pageStack: NavPathStack = new NavPathStack()

aboutToAppear(): void {
  this.pageStack.disableAnimation(true)
}
单次关闭

NavPathStack中提供的push、pop、replace等接口中可以设置animated参数来进行单次关闭。

pageStack: NavPathStack = new NavPathStack()

this.pageStack.pushPath({ name: "PageOne" }, false)
this.pageStack.pop(false)

自定义转场

Navigation通过costomNavContentTransition事件提供自定义转场动画的能力。

  1. 构建一个自定义转场动画工具类,通过map管理各个页面自定义动画对象CustomTransition,页面创建的时候注册自定义转场动画,页面销毁的时候解注册。
  2. 实现一个转场协议对象NavigationAnimatedTransition,其中timeout属性表示转场结束的超时时间,默认为1000ms,transition属性为自定义的转场动画方法,开发者要在这里实现自己的转场动画逻辑,系统会在转场开始时调用该方法,onTransitionEnd为转场结束时的回调。
  3. 调用customNavContentTransition方法,返回实现的转场协议对象,如果返回undefined,则使用系统默认转场。

共享元素转场

NavDestination之间切换时可以通过geometryTransition实现共享元素转场。配置了共享元素转场的页面同时需要关闭系统默认的转场动画。

  1. 为需要实现共享元素转场的组件添加geometryTransition属性,id参数必须在两个NavDestination之间保持一致。

    // 起始页配置共享元素id
    NavDestination() {
    Column() {
        ...
        Image($r('app.media.startIcon'))
        .geometryTransition('sharedId')
        .width(100)
        .height(100)
    }
    }
    .title('FromPage')
    
    // 目的页配置共享元素id
    NavDestination() {
    Column() {
        ...
        Image($r('app.media.startIcon'))
        .geometryTransition('sharedId')
        .width(200)
        .height(200)
    }
    }
    .title('ToPage')
    
  2. 将页面路由的操作,放到animateTo动画闭包中,配置对应的动画参数以及关闭系统默认的转场。

    NavDestination() {
    Column() {
        Button('跳转目的页')
        .width('80%')
        .height(40)
        .margin(20)
        .onClick(() => {
            animateTo({ duration: 1000 }, () => {
            this.pageStack.pushPath({ name: 'ToPage' }, false)
            })
        })
    }
    }
    .title('FromPage')
    

跨包动态路由

通过静态import页面再进行路由跳转的方式会造成不同模块之间的依赖耦合,以及首页加载时间长等问题。

动态路由设计的目的就是为了解决多个模块(HAR/HSP)之间可以复用相同的业务,各个业务模块之间解耦和路由功能扩展整合。

动态路由的优势

  1. 路由定义除了跳转的URL以外,可以丰富的配置扩展信息,如横竖屏默认模式,是否需要鉴权等等,做路由跳转时统一处理。
  2. 给每个路由页面设置一个名字,按照名称进行跳转而不是文件路径。
  3. 页面的加载可以使用动态Import(按需加载),防止首个页面加载大量代码导致卡顿。

动态路由提供系统路由表和自定义路由表两种方式,支持混用。

  • 系统路由表相对自定义路由表,使用更简单,只需要添加对应页面跳转配置项,即可实现页面跳转。
  • 自定义路由表使用起来更复杂,但是可以根据应用业务进行定制处理。

系统路由表

Navigation支持使用系统路由表的方式进行动态路由。各业务模块(HSP/HAR)中需要独立配置router_map.json文件,在触发路由跳转时,应用只需要通过NavPathStack提供的路由方法,传入需要路由的页面配置名称,此时系统会自动完成路由模块的动态加载、页面组件构建,并完成路由跳转,从而实现了开发层面的模块解耦。其主要步骤如下:

  1. 在跳转目标模块的配置文件module.json5添加路由表配置:

      {
        "module" : {
          "routerMap": "$profile:route_map"
        }
      }
    
  2. 添加完路由配置文件地址后,需要在工程resources/base/profile中创建route_map.json文件。添加如下配置信息:

      {
        "routerMap": [
          {
            "name": "PageOne",//跳转页面名称
            "pageSourceFile": "src/main/ets/pages/PageOne.ets",//跳转目标页在包内的相对路径,相对src目录的相对路径
            "buildFunction": "PageOneBuilder",//跳转目标页的入口函数名称,必须用@Builder修饰。
            "data": {//自定义字段,可以通过getConfigInRouteMap方法获取
              "description" : "this is PageOne"
            }
          }
        ]
      }
    
  3. 在跳转目标页面中,需要配置入口Builder函数,函数名称需要和router_map.json配置文件中的buildFunction保持一致,否则在编译时会报错。

      // 跳转页面入口函数
      @Builder
      export function PageOneBuilder() {
        PageOne()
      }
    
      @Component
      struct PageOne {
        pathStack: NavPathStack = new NavPathStack()
    
        build() {
          NavDestination() {
          }
          .title('PageOne')
          .onReady((context: NavDestinationContext) => {
             this.pathStack = context.pathStack
          })
        }
      }
    
  4. 通过pushPathByName等路由接口进行页面跳转。(注意:此时Navigation中可以不用配置navDestination属性)

      @Entry
      @Component
      struct Index {
        pageStack : NavPathStack = new NavPathStack();
    
        build() {
          Navigation(this.pageStack){
          }.onAppear(() => {
            this.pageStack.pushPathByName("PageOne", null, false);
          })
          .hideNavBar(true)
        }
      }
    

自定义路由表

  1. 定义页面跳转配置项。
    • 使用资源文件进行定义,通过资源管理@ohos.resourceManager在运行时对资源文件解析。
    • 在ets文件中配置路由加载配置项,一般包括路由页面名称(即pushPath等接口中页面的别名),文件所在模块名称(hsp/har的模块名),加载页面在模块内的路径(相对src目录的路径)。
  2. 加载目标跳转页面,通过动态import将跳转目标页面所在的模块在运行时加载, 在模块加载完成后,调用模块中的方法,通过import在模块的方法中加载模块中显示的目标页面,并返回页面加载完成后定义的Builder函数。
  3. 触发页面跳转,在Navigation的navDestination属性执行步骤2中加载的Builder函数,即可跳转到目标页面。
【HarmonyOS】初识ArkUI——快速实现页面导航之Navigation 关于基本概念就不再多做介绍了,有需要的直接点击上面的链接进行了解即可,我们直接进入正题。HarmonyOS、ArkUI、Navigation、自定义导航栏、底部导航。OK,本期内容就到这里啦,下期再会! 阅读详情

相关推荐

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件。

zdh13370188237的博客 1837

HarmonyOS ArkUI实战开发-页面导航(Navigation)

Navigation的定义不需要传递相关参数,我们先看下NavigationNavigation() { // Navigation只能包含一个子组件.size({width: '100%', height: '100%'}) // Navigation只设置了size,没有设置任何其它属性样例运行结果如下图所示:由运行结果可知,在默认情况下,Navigation的样式是一个带有返回箭头的标题栏加子控件组成的。title:设置导航栏的标题,当参数类型为string。

1 1775

【鸿蒙 ArkUI实战开发】——Navigation实现多设备适配案例

在应用开发时,一个应用需要适配多终端的设备,使用Navigation的mode属性来实现一套代码,多终端适配。

huchenghe2的博客 1220

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面之Navigation(二)

Navigation是路由容器组件,一般作为**首页的根容器**,包括**单栏(Stack)、分栏(Split)和自适应(Auto)**三种显示模式。Navigation组件适用于**模块内和跨模块的路由切换**,一次开发,多端部署场景。通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。在不同尺寸的设备上,N**avigation组件能够自适应显示大小,自动切换分栏展示效果**。

一个不断前行的程序者 2025

鸿蒙开发基础 —— ArkUI 组件:Router切换Navigation

从API version 12版本开始,Navigation支持系统跨模块的路由表方案,整体设计是将路由表方案下沉到系统中管理,即在需要路由的各个业务模块(HSP/HAR)中独立配置router_map.json文件,在触发路由跳转时,应用只需要通过NavPathStack进行路由跳转,此时系统会自动完成路由模块的动态加载、组件构建,并完成路由跳转功能,从而实现了开发层面的模块解耦。Router原生没有提供路由拦截的能力,开发者需要自行封装路由跳转接口,并在自己封装的接口中做路由拦截的判断并重定向路由。

guangxishaoji的博客 1243

ArkUI中的Navigation全面解析:构建高效导航体系(一)

本文介绍了鸿蒙开发中自定义Navigation组件的关键功能。Navigation作为路由导航的根视图容器,支持单栏、分栏和自适应三种显示模式,可根据屏幕宽度自动切换布局。文章详细讲解了标题栏样式设置(Mini/Full/Free模式)、菜单栏和工具栏配置方法,以及基于NavPathStack的路由操作,包括页面跳转、返回、替换、删除等核心功能。此外还介绍了参数获取、路由拦截和单例跳转等高级特性,帮助开发者实现灵活的路由管理和页面复用。所有代码示例均在DevEco Studio 5.1.1上验证通过。

我叫柱子哥 1126

【愚公系列】2023年12月 HarmonyOS教学课程 025-ArkUI组件(Navigation)

Navigation组件通常作为页面的根容器,支持单页面、分栏和自适应三种显示模式。开发者可以使用Navigation组件提供的属性来设置页面的标题栏、工具栏、导航栏等。

愚公智库 6万+

Windows事件ID 10010报错:DCOM注册超时与Game Bar修复指南

DCOM(分布式组件对象模型)是Windows中用于跨进程组件通信的核心机制,其注册超时问题常表现为事件ID 10010报错。当Game Bar的PresenceWriter组件因权限配置不当、组件损坏或开机资源竞争而无法在限定时间内向DCOM注册时,系统会记录该错误,并可能伴随DCOM服务主机CPU占用升高或游戏栏功能异常。理解DCOM激活原理与Network Service账户权限,有助于从权限修复、组件重注册及开机时序优化等层面系统排查。本文针对不同Windows版本,提供从静默处理到根治的完整方案,

weixin_33563728的博客 907

ARKUI-Navigation

组件导航(Navigation)主要用于实现页面间以及组件内部的页面跳转,支持在不同组件间传递跳转参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。是路由导航的根视图容器,一般作为页面(@Entry)的根容器,包括)、和三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。场景下,Navigation组件能够自动适配窗口显示大小,在窗口较大的场景下自动切换分栏展示效果。

m0_71423594的博客 1612

贝莱德(BlackRock)—— 阿拉丁(Aladdin)平台的 AI 赋能升级

全称(资产、负债、债务与衍生品投资网络),是贝莱德自主研发的一体化投资管理与风险管理技术平台,被誉为全球资管行业的 “

xm_mm的博客 1724

使用C#调用百度地图并实现坐标点的设置以及读取

使用C#调用百度地图申请百度地图密钥以及查看百度API程序实现功能:最终图利用webBrowser控件展示地图 申请百度地图密钥以及查看百度API 网址:http://lbsyun.baidu.com/apiconsole/key#/home 网址:http://lbsyun.baidu.com/jsdemo.htm#c1_3 程序实现功能: 1、输入网址那可以调用本地的html文件,也可以访问其他网站 2、输入坐标、添加坐标按钮,可以将坐标值传入html文件中,显示在经纬度的文本框中 3、定位按钮可以

qq_39261042的博客 3734

【鸿蒙ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件

本文介绍了华为鸿蒙系统中的Navigation导航容器及其相关组件。Navigation作为路由导航的根视图容器,支持单栏、分栏和自适应三种显示模式,通过NavPathStack控制器管理子页面栈。系统包含三个核心组件:1)Navigation导航容器,作为全局或局部导航使用;2)NavBar导航栏,可控制显隐和布局;3)NavDestination子页容器,支持页面生命周期、转场动画等功能。三者协同工作,通过NavPathStack实现路由切换、页面管理等功能,支持开发者在不同场景下灵活构建导航架构。

Alan_rust的博客 1019

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7)

weixin_44312889的博客 6309

ArkUI---Navigation组件介绍

Navigation是路由容器组件,一般作为首页的根容器,包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation组件适用于模块内和跨模块的路由切换,一次开发、多段部署场景。通过组件级路由能力实现更加自然流畅的转场体验,并提供多种标题栏样式来呈现更好的标题和内容联动效果。在不同尺寸的设备上,Navigation组件能够自适应显示大小,自动切换分栏展示效果。Navigation组件主要包含​导航页(NavBar)和子页(NavDestination)。

sinat_34896766的博客 1113

Android车载多屏开发实战:从零搭建同显/异显Demo(附源码)

本文详细介绍了Android车载多屏开发的实战经验,从零搭建同显/异显Demo,涵盖多屏模拟、核心API调用、同显/异显架构实现及性能优化等关键环节。通过C++构建完整开发链路,帮助开发者快速掌握多屏同显和多屏异显技术,提升智能座舱系统的交互体验。附源码供参考。

weixin_29233857的博客 404

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 812

【鸿蒙ArkUI路由/导航系列】〇:ArkUI Navigation组件全面解析:从基础导航到高级路由的实践

【鸿蒙ArkUI路由/导航系列】一:ArkUI路由原理简介,认识Navigation组件详细阐述了Navigation作为导航容器的角色,支持全局及局部导航,并具有单栏(Stack)、分栏(Split)及自适应(Auto)三种显示模式。Navigation组件由导航栏(NavBar)和子页(NavDestination)构成,通过NavPathStack管理子页切换。文章还介绍了Navigation的高级特性,如自定义转场动画、路由拦截及生命周期管理,为开发者提供了全面的Navigation组件使用指南。

Alan_rust的博客 2296

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4899

13.ArkUI Navigation的介绍和使用

Entry@Componentbuild() {Column() {Text('页面内容').title('自定义标题').subTitle('副标题').toolBar({items: [// 分享操作},})

长沙火山 536

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 562

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【鸿蒙ArkUI路由/导航系列】二:Navigation基础路由操作,让页面跳转起来

本文介绍了如何在HarmonyOS中使用Navigation实现页面跳转。首先需要创建NavPathStack绑定到Navigation组件,然后构建子页面并配置路由表。主要路由操作包括:push(创建新页面)、pop(删除栈顶页面)和replace(替换当前页面),支持控制动画效果。开发者可通过NavPathStack的API实现页面切换,并推荐将导航控制器存储在AppStorage中以便全局调用。文章还提供了隐藏导航栏和单实例跳转等进阶使用方法。

Alan_rust的博客 1082

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

鸿蒙next开发:ArkUI组件(Navigation)

Navigation组件通常作为页面的根容器,支持单页面、分栏和自适应三种显示模式。

Aym88的博客 968

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ArkUI--Navigation路由操作

自定义转场步骤:a、构建一个自定义转场动画工具类CustomNavigationUtils,通过一个Map管理各个页面自定义动画对象CustomTransition,页面在创建的时候将自己的自定义转场动画对象注册进去,销毁的时候解注册;

sinat_34896766的博客 2072

HarmonyOS-ArkUI Navigation (导航组件)-二 Router,Navigation, HMRouter 的区别

Router、Navigation、HMRouter三者的发展脉络,本质是鸿蒙导航方案从系统级页面导航向应用级组件导航的演进,核心是为了解决Router的Page页面过重、栈深度受限、灵活性差等痛点。Router作为初代方案,完成了鸿蒙页面导航的基础落地,但受限于系统级Page的设计,无法满足复杂应用的需求;Navigation作为新一代原生方案,从设计理念上颠覆了Router,将导航下沉到组件层,实现了轻量化、无栈限制、高灵活性,是鸿蒙官方的核心推荐方案;

童年纸飞机的博客 673
上一篇: ArkUI-布局(四)
下一篇: 鸿蒙UIAbility组件进阶
gitzzp
博客等级 码龄11年 307粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值