最新要闻
- 每日资讯:Intel带着56核心再次发烧!新座驾降临 能插16条内存
- 环球头条:大批192号段诈骗电话出现!中国广电发布提醒:电商客服不会用192
- 热文:一项大奖的所有得主:都没有后代 为什么呢?
- 动态焦点:SpaceX预告2023年第一发:一箭114星!超越印度新纪录
- 要再见了!《魔兽世界》临时充值渠道将于1月1日0点正式关闭
- 詹姆斯生日夜狂砍47分!杜兰特盛赞其表现:神迹!
- 天天速递!仅仅10年 中国在西部修了2.5万公里铁路
- 【天天聚看点】直播央视2023跨年晚会:明星阵容豪华、两大运动员登台
- 3999元 LG新款27英寸显示器开售:搭载4K Nano IPS Black屏
- 2423公里!曾经的中国西部最长铁路 开通60年了
- 焦点热门:妈妈给儿子读英语 发音如原声磁带!6岁孩子开口惊人
- 玩家吐槽《塞尔达传说:王国之泪》NS限定机太丑:希望不是真的
- 报道:屏幕碾压iPhone 14 Pro!红魔8 Pro系列20点开售:3999元起
- 今日快看!男子上公厕10分钟门自动打开:装了定时器 网友吐槽不合理
- 36个月流畅不卡顿!卢伟冰:Redmi 12C满足低预算人群核心需求
- 手工耿又出大作 自制小黄人悬空火炉 网友:有用、想要
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点热讯:MAUI新生6.5-导航路由Navigation
MAUI的Shell导航框架,也是以路由方式进行导航,并提供了两套导航方式,一是如前面章节所述的视觉层次结构,会自动建立导航路由,可以进行不同层次页面的导航切换;二是为页面手动注册路由,并执行代码导航。
(相关资料图)
一、注册路由
1、视觉层次结构页面的路由注册
在视觉层次结构中(Shell>FlyoutItem或TabBar>Tab>ShellContent),框架自动建立导航路由,可以直接进行导航切换。如果要通过代码导航到视觉层次页面,可以在定义视觉层次结构时,显示的定义路由,如:
animals domestic cats dogs monkeys bears elephantsabout
2、非视觉层次结构页面的路由注册
MAUI中还有很多页面,没有在视觉层次结构中定义,这些页面需要进行手动注册路由,一般在AppShell后台代码的构造函数中进行。
public partial class AppShell : Shell{ public AppShell() { InitializeComponent(); //注册非视觉层次页面路由,所有路由名称需保持唯一,它们是全局的 //当导航到视觉层次结构中的路由时,并不会创建导航堆栈;但导航到非视觉层次页面路由时,创建导航堆 Routing.RegisterRoute("dogdetail",typeof(DogDetail)); Routing.RegisterRoute("monkeydetail", typeof(MonkeyDetail)); //也可以将路由注册到不同的视觉层次结构上,可以实现跟踪当前路由层次,导航到不同的页面 //如下例中,都是导航到detail,但在dogs路由层次结构中时,将导航到DogDetail;反之,将导航到MonkeyDetail Routing.RegisterRoute("dogs/detail", typeof(DogDetail)); Routing.RegisterRoute("monkeys/detail", typeof(MonkeyDetail)); }}
二、执行导航
1、在视觉层次结构中,可以直接执行导航跳转。注:这些跳转页面,不会进入到导航堆栈中。
2、非视觉层次结构的页面,需要通过编程式导航来实现。
//下例为Monkeys页面,通过按钮点击事件进行导航public partial class Monkeys : ContentPage{ ......private async void Button_Clicked(object sender, EventArgs e) { //Shell.Curren获得对当前Shell对象的引用,等效于((Shell)App.Current.MainPage) //Shell对象包括了GoToAsync导航方法,以及CurrentItem、CurrentPage、CurrentState、BackButtonBehavior等属性 await Shell.Current.GoToAsync("dogdetail"); await ((Shell)App.Current.MainPage).GoToAsync("dogdetail"); await DisplayAlert("显示当前路由", Shell.Current.CurrentState.Location.ToString(), "OK"); }}
3、绝对路由和相对路由
- 视觉层次结构的页面,可以通过绝对路径进行导航,如【Shell.Current.GoToAsync("//animals/domestic/dogs")】
- 非视觉层次结构的页面,可以通过相对路径进行导航,如【Shell.Current.GoToAsync("dogdetail")】
- 上下文导航。注册非视觉层次结构页面时,将路由注册到结构层次页面上,如Routing.RegisterRoute("monkeys/detail"...)。当在Monkeys页面中,导航到detail时,会匹配monkeys/detail。
- 向后导航。向后导航,【await Shell.Current.GoToAsync("..")】;向后导航与路由导航结合,【await Shell.Current.GoToAsync("../route")】;可以多次向后导航,【await Shell.Current.GoToAsync("../../route")】
- 关于路由导航,还有一些概念比较模糊,建议暂时按以上两种方式来导航
三、导航传参
1、传递参数。
1)方法一:查询字符串
//传递字符串:直接通过查询字符串传递参数//传递一个字符串参数await Shell.Current.GoToAsync("monkeydetail?name=sun");//传递多个字符串参数await Shell.Current.GoToAsync("monkeydetail?name=sun&sex=male");//也可以使用内插值变量string name = "sun"await Shell.Current.GoToAsync($"monkeydetail?name={name}");
2)方法一:字典类型参数
//传递对象:通过GoToAsync方法的第二个参数,IDictionary字典类型对象传参//传递一个对象var p1 = new Person{Name="zs",Age=18};var navigationParam = new Dictionary { { "person1", p1 }};await Shell.Current.GoToAsync($"persondetail", navigationParame);//传递多个对象var p1 = new Person{Name="zs",Age=18};var p2 = new Person{Name="ls",Age=28};var navigationParam = new Dictionary { { "person1", p1 } { "person2", p2 }};await Shell.Current.GoToAsync($"persondetail", navigationParame);
2、接收参数。
1)方法一:通过QueryProperty特性,接收路由参数
//QueryProperty特性//QueryProperty特性的第一个参数为接收路由参数的属性,第一个参数为路由参数的键名//通过查询参数传递的路由参数,会自动转为键值对形式//注意接收路由参数的属性,必须是可观察属性(MVVM),触发PropertyChanged事件[QueryProperty(nameof(Name), "name")][QueryProperty(nameof(Sex), "sex")]public partial class MonkeyDetail : ContentPage{ public MonkeyDetail() { InitializeComponent(); BindingContext = this; //将BindingContext设置为当前对象 } //定义可观察属性Name来接收键名为name的路由参数 private string name; public string Name { get { return name; } set { name = value; OnPropertyChanged(); } } //定义可观察属性Sex来接收键名为sex的路由参数 private string sex; public string Sex { get { return sex; } set { sex = value; OnPropertyChanged(); } }}//XAML文件中使用路由参数
2)方法二:通过实现IQueryAttributable接口,接收路由参数(在ViewModel中使用)
//接收字符串路由参数public class PersonDetailViewModel : IQueryAttributable, ObservableObject{ [ObservableProperty] private string name; [ObservableProperty] private string sex; public void ApplyQueryAttributes(IDictionaryquery) { name = HttpUtility.UrlDecode(query["name"].ToString()); sex = HttpUtility.UrlDecode(query["sex"].ToString()); }}//接收对象类型参数public class PersonDetailViewModel : IQueryAttributable, INotifyPropertyChanged{ [ObservableProperty] private Person person; public void ApplyQueryAttributes(IDictionary query) { person = query["p1"] as Person; } ...}
四、路由守卫
1、全局守卫:类似于生命周期函数,Shell类提供OnNavigating(导航发生前)和OnNavigated(导航发生后)可重写方法,通过重写这两个方法,可以对导航进行控制,实现路由守卫的功能。OnNavigating和OnNavigated方法,在AppShell.xaml.cs中定义。
//OnNavigating和OnNavigated方法的常用属性和方法public partial class AppShell : Shell{ public AppShell() { InitializeComponent(); ...... } protected override void OnNavigating(ShellNavigatingEventArgs args) { base.OnNavigating(args); ShellNavigationState current = args.Current;//当前页,可通过Location属性获取URL ShellNavigationState target = args.Target; //目标页,可通过Location属性获取URL ShellNavigationSource source = args.Source; //导航类型,枚举,包括Unknown/Push/Pop/PopToRoot/Insert/Remove/ShellItemChanged/ShellSectionChanged/ShellContentChanged bool canCancle = args.CanCancel; //是否可以取消 bool canclled = args.Cancelled; //是否取消 args.Cancel(); //取消导航 //获取导航令牌,并完成导航 ShellNavigatingDeferral token = args.GetDeferral(); token.Complete(); } protected override void OnNavigated(ShellNavigatedEventArgs args) { base.OnNavigated(args); ShellNavigationState current = args.Current; //当前页 ShellNavigationState previous = args.Previous; //上一页 ShellNavigationSource source = args.Source; //导航类型 }}//案例一:取消各后导航protected override void OnNavigating(ShellNavigatingEventArgs args){ base.OnNavigating(args); if (args.Source == ShellNavigationSource.Pop) { args.Cancel(); }}//案例二、跟进弹出框的选择按钮,确定是否继续导航protected override async void OnNavigating(ShellNavigatingEventArgs args){ base.OnNavigating(args); ShellNavigatingDeferral token = args.GetDeferral(); var result = await DisplayActionSheet("Navigate?", "Cancel", "Yes", "No"); if (result != "Yes") { args.Cancel(); } token.Complete();}
2、局部守卫:Shell层次结构中的Tab,提供了一系列的重写方法。我们可以自定义Tab的派生类,并重新定义这些重写方法。在视觉层次结构中使用自定义的Tab派生类,就可以控制这个Tab下的路由行为,从而实现局部守卫的功能。
public class MyTab:Tab{ protected override void OnInsertPageBefore(Page page, Page before) { base.OnInsertPageBefore(page, before); } protected override void OnRemovePage(Page page) { base.OnRemovePage(page); } protected override TaskOnPopAsync(bool animated) { return base.OnPopAsync(animated); } protected override Task OnPushAsync(Page page, bool animated) { return base.OnPushAsync(page, animated); } protected override Task OnPopToRootAsync(bool animated) { return base.OnPopToRootAsync(animated); }}
五、后退按钮
当导航到非结构层次页面时,会创建导航堆栈,并显示后退按钮,可以重新定义后退按钮的样式和行为
......
六、Navigation导航
Navigation导航类,在Shell框架中仍然可以使用,但不建议混合使用。Navigation会创建导航堆栈,并显示后退按钮。如:
//导航和后退await Navigation.PushAsync(new DetailsPage());await Navigation.PopAsync();await Navigation.PushModalAsync(new DetailsPage());await Navigation.PopModalAsync();//导航传参Contact contact = new Contact{ Name = "Jane Doe", Age = 30, Occupation = "Developer", Country = "USA"};...await Navigation.PushModalAsync(new DetailsPage(contact));//通过BindingContext导航传参Contact contact = new Contact{ Name = "Jane Doe", Age = 30, Occupation = "Developer", Country = "USA"};await Navigation.PushAsync(new DetailsPage{ BindingContext = contact });
焦点热讯:MAUI新生6.5-导航路由Navigation
每日资讯:Intel带着56核心再次发烧!新座驾降临 能插16条内存
环球头条:大批192号段诈骗电话出现!中国广电发布提醒:电商客服不会用192
热文:一项大奖的所有得主:都没有后代 为什么呢?
动态焦点:SpaceX预告2023年第一发:一箭114星!超越印度新纪录
要再见了!《魔兽世界》临时充值渠道将于1月1日0点正式关闭
詹姆斯生日夜狂砍47分!杜兰特盛赞其表现:神迹!
第119篇: JavaScript 类
天天速递!仅仅10年 中国在西部修了2.5万公里铁路
【天天聚看点】直播央视2023跨年晚会:明星阵容豪华、两大运动员登台
3999元 LG新款27英寸显示器开售:搭载4K Nano IPS Black屏
2423公里!曾经的中国西部最长铁路 开通60年了
焦点热门:妈妈给儿子读英语 发音如原声磁带!6岁孩子开口惊人
玩家吐槽《塞尔达传说:王国之泪》NS限定机太丑:希望不是真的
报道:屏幕碾压iPhone 14 Pro!红魔8 Pro系列20点开售:3999元起
今日快看!男子上公厕10分钟门自动打开:装了定时器 网友吐槽不合理
36个月流畅不卡顿!卢伟冰:Redmi 12C满足低预算人群核心需求
手工耿又出大作 自制小黄人悬空火炉 网友:有用、想要
世界微资讯!AcWing 1359. 洛谷P1457 城堡
LaTeX快速入门
【天天聚看点】早餐来一盒 伊利高端品牌金典纯牛奶24盒到手76元
世界报道:28年再温经典!周星驰电影《大话西游》元旦抖音全网独播
当前热讯:Python类的多态和多态性
当前观点:红绿灯倒计时覆盖量破百万 百度地图:全国3000县市只差1个没有
世界新消息丨“流氓软件”拜拜!手机预装App终于要能卸载了:新规明天执行
长城大气!魏牌官宣:国补取消后插混车型不涨价
马斯克疯狂省钱:断供厕纸、辞退保洁、退租办公室
Codeforces Good Bye 2022 CF 1770 A~E 题解
世界观天下!上调幅度2000到6000元!比亚迪宣布调整相关车型官方指导价
【环球热闻】今晚20点播出!央视跨年晚会阵容官宣:短道速滑运动员武大靖加盟
每日简讯:分布式排队叫号系统源码出售
口碑崩盘豆瓣评分跌至5.4!《三体》动画第五集上线你还追吗?
WPF 实现通知属性的N种方式
P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior
全球滚动:从USB存储设备启动树莓派
全球快看:满满维生素!可口可乐innocent果汁大促:三瓶券后不到15元
天天热门:长绒棉亲肤透气 浪莎男士中筒袜子5双21.55元
每日讯息!2023元旦档预售总票房破1亿元:《阿凡达2:水之道》第一
《王者荣耀》铠荣耀典藏皮肤今晚上线!三形态特效帅炸
头条:游戏火爆全球 海外营收过半!米哈游获评全国文化企业30强
快播:Unreal学习笔记1-打印输出
环球速读:史上财富损失第一人:马斯克财产缩水破人类记录
即时:官旗抄底:新疆大红乌苏啤酒500ml*12罐整箱59.9元
环球即时:沙特球队官宣C罗加盟 本人回应:是时候来亚洲分享经验了
一加11R外观泄露:双曲面屏、后置三摄
MySQL报错解决
当前观点:联想YOGA新款笔记本曝光:双屏显示、支持360度翻转
天天快资讯:0糖、0脂肪!Nevercoffee咖啡:10盒到手16.41元
天天快资讯丨兴泉铁路全线开通:8个老区终于坐上火车
【世界报资讯】电脑上没有“锤子大爆炸”:自己做一个!
环球快播:辽宁吉林多地现不明飞行物:外星飞船?还是韩国制造?
天天速讯:女子因上厕所未在工位被领导打:网友集体愤怒
天天日报丨知情人士:李子柒短期内或不考虑复出 业内看好重回顶流
速递!奥迪最帅量产电车!RS e-tron GT上市:146.88万秒杀保时捷
网友在苹果官方旗舰店买iPhone 13:取消订单却不给退款
快讯:三大件不再是重点 调查显示:84.5%消费者更看重汽车智能化
环球微动态丨ColorOS 13 2023年Q1适配计划出炉:10款机型喜提正式版
环球新动态:2022年总结与反思
全球热文:显卡清库存告一段落 价格已经到底:AMD、NVIDIA不会再便宜
【全球新要闻】RTX 4090游戏本狂野!一脚踢翻桌面RTX 3090
有你吗?我国千兆宽带用户达到8707万户 同比增长157%
全球最新:联想SmartPaper墨水平板曝光:10.3寸大屏、23ms低延迟
天天即时:国产游戏《大多数》称《九霄大陆》是盗版 把自己破解了
【天天时快讯】HDU 6801 Game on a Circle 题解 (推式子,多项式)
LeetCode-400. 第N位数字
全球观热点:红黑树起源以及插入解析
世界简讯:“最牛00后”:成都122岁长寿老人朱郑氏去世 家人100多名
全球快看点丨女子圣诞节送男友PS5:送礼前先把自己感动哭了
【全球速看料】比亚迪发布公告:终止拆分半导体业务上市
世界热门:新能源车国补即将取消 零跑表态:零跑C01不涨价
【全球独家】复习Stream流,函数式接口,方法引用
【天天新视野】最贵国产电动车高合HiPHi X宣发闹乌龙:零百加速45分钟
全球信息:杀死110公斤牛 北半球最凶猛的鸟金雕复仇人类:缝了40针
热资讯!软嫩多汁 拒绝合成肉:大希地整切牛排55.8元/斤好价
新能源车二手车:又红火起来了
全球热消息:腾讯今年股价曾腰斩 累计回购超9000万股 耗资超337亿港元
环球快消息!特色功能(锐捷智慧教室)
RX 7900 XTX温度烧到110度 AMD终于回应了:请联系客服支持
全球热议:盗版电影画质越发高得可怕 英国正版组织怒出手:嫌疑人落网
苹果允许安装第三方商店 但用户愿意吗?
【独家】RTX 4070 Ti官方偷跑!跑分都亮出来了
东方甄选直播一周年:股价翻800% 腾讯亏惨了
Android Emulator Container 配置
京东自营次日达 抗原检测试剂盒4.9元/份:15分钟出值
每日焦点!百度“萝卜快跑”首批获准在京开展全无人自动驾驶测试
当前观察:洗鞋机竟成了香饽饽!市场一片繁荣
2000年来首次发生!苹果2022年第四季度未发布任何新Mac产品
当前视讯!扬州高邮湖大桥几十辆车相撞 事故原因又是团雾
当前滚动:亲测有效! Studio One 6 V6.0.1 音乐编曲工具 含win/mac版
stm32读写sd卡代码解析和调试总结
前沿热点:Django路由层
全球微头条丨湖南汽车商会:汽车平台大涨价 4S店给汽车之家引流费一年最低23万
焦点热门:与热爱同行 18年魅族用户已是曹操出行CEO:希望有天把Flyme放进车机
环球关注:比亚迪仰望汽车来了!搭载最具颠覆性的尖端技术
天天快讯:太烂没人看?《阿凡达2》全球票房破11亿美元:中国内地贡献排第二
全球热头条丨零百6.9秒、纯电续航100km:坦克500 PHEV亮相广州车展
即时焦点:org.quartz.JobPersistenceException: Couldn't retrieve trigger: invalid stre
焦点热讯:MyBatis分页实现
世界百事通!现代细胞计数分析平台丨OMIQ简介
全球新动态:世界第一国际象棋手3分钟比赛迟到2分半 仅用22秒取胜