使用场景
在普遍的业务场景当中, 必不可少的是页面切换, 而prism就可以使用navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证、传递参数、返回上一页、返回下一页等功能。
导航的基本条件
1.注册显示区域
2.注册导航页面
1.注册导航
注册视图类型或添加别名, 如果为指定别名,名称默认为当中类型的名称
public class moduleamodule : imodule { public void oninitialized(icontainerprovider containerprovider) { } public void registertypes(icontainerregistry containerregistry) { //添加别名 "customname" containerregistry.registerfornavigation<viewa>("customname"); //默认名称 "viewb" containerregistry.registerfornavigation<viewb>(); } }
注册时,指定viewmodel或添加别名。
public class moduleamodule : imodule { public void oninitialized(icontainerprovider containerprovider) { } public void registertypes(icontainerregistry containerregistry) { //指定viewmodel containerregistry.registerfornavigation<viewa, viewaviewmodel>(); //指定viewmodel并且添加别名 containerregistry.registerfornavigation<viewb, viewbviewmodel>("customname"); } }
2.使用导航
正如前面的章节所讲到, region的注册以及管理、导航等, 我们可以使用iregionmanager接口,所以,我们现在便可以使用该接口实现导航功能, 如下所示:
iregionmanager regionmanager = …; regionmanager.requestnavigate("regionname", "viewname");
可以注意点, 我们调用了iregionmanager接口的requestnavigate方法, 并且传递了两个参数:
- regionname: 该参数为注册的区域名称
- viewname: 该参数实际为我们上面注册过的导航页, 字符串类型, 对应的是我们注册页面的nameof
3.带参数导航
正如,我们想要在导航页前, 传递一些参数, 则可以使用navigationparameters, 如下所示:
var param = new navigationparameters(); param.add("parameter", param); _regionmanger.requestnavigate("regionname", "viewname", param); //类似url地址传递参数 _regionmanger.requestnavigate("regionname", "viewname?id=1&name=xiaoming");
疑问?
当我们使用导航为指定区域注册视图时, 我们怎么控制打开的过程? 所以, 下面我们将讲解一下
inavigationaware接口。
inavigationaware
该接口包含3个方法, 每个方法中都包含当前导航的上下文, 如下所示:
public void onnavigatedto(navigationcontext navigationcontext) { } public bool isnavigationtarget(navigationcontext navigationcontext) { return true; } public void onnavigatedfrom(navigationcontext navigationcontext) { }
- onnavigatedto: 导航完成前, 此处可以传递过来的参数以及是否允许导航等动作的控制。
- isnavigationtarget: 调用以确定此实例是否可以处理导航请求。否则新建实例
- onnavigatedfrom: 当导航离开当前页时, 类似打开a, 再打开b时, 该方法被触发。
inavigationaware 执行流程
获取导航请求参数
正如上面所描述, 导航中允许我们传递参数, 用于在我们完成导航之前, 进行做对应的逻辑业务处理。这时候, 我们便可以在onnavigatedto方法中通过导航上下文中获取到传递的所有参数。如下:
public void onnavigatedto(navigationcontext navigationcontext) { var id = navigationcontext.parameters.getvalue<int>("id"); var name = navigationcontext.parameters["name"].tostring(); }
iconfirmnavigationrequest
该接口继承于inavigationaware, 所以, 它多了一个功能: 允许用户针对导航请求进行拦截。
//多了一个回调函数, 该值觉得是否拦截该导航请求 void confirmnavigationrequest(navigationcontext navigationcontext, action<bool> continuationcallback);
iconfirmnavigationrequest 执行流程
拦截导航请求
当打开新的导航时, 或许有些情况下你需要经过用户进行确认, 这个时候, iconfirmnavigationrequest接口可以满足需求, 如下:
public void confirmnavigationrequest(navigationcontext navigationcontext, action<bool> continuationcallback) { bool result = true; if (messagebox.show("确认导航?", "温馨提示", messageboxbutton.yesno) == messageboxresult.no) result = false; //通过回调当前返回的确认结果,决定是否启动该导航 continuationcallback(result); }
navigation journal
导航日志, 其实就是对导航系统的一个管理功能, 理论上来说, 我们应该知道我们上一步导航的位置、以及下一步导航的位置, 包括我们导航的历史记录。以便于我们使用导航对应用程序可以灵活的控制。
iregionnavigationjournal
该接口包含以下功能:
- goback() : 返回上一页
- cangoback : 是否可以返回上一页
- goforward(): 返回后一页
- cangoforward : 是否可以返回后一页
1.示例(返回上一页)
当导航日志当中,包含上一页的历史记录, 如下所示, d的前面有abc的记录,所以对于d而言, 它可以返回上一页, 所以cangoback 为true。
2.示例(返回下一页)
当导航日志当中,包含下一个的历史记录,如下所示,d的后面有e的记录,所以对于d而言,它可以返回下一页,所以cangoforward 为true。
到此这篇关于wpf框架prism中导航navigation用法介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。
发表评论