当前位置: 代码网 > it编程>编程语言>Asp.net > WPF框架Prism中导航Navigation用法介绍

WPF框架Prism中导航Navigation用法介绍

2024年05月19日 Asp.net 我要评论
使用场景在普遍的业务场景当中, 必不可少的是页面切换, 而prism就可以使用navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证、传递参数、返回上一页、返回下

使用场景

在普遍的业务场景当中, 必不可少的是页面切换, 而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用法介绍的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com