WPF Prism框架(导航)

1.背景

导航是为了实现不同界面的切换,是一种组织系统功能的方式。提供两种导航,一是基于View切换,二是基于ViewModel状态。

2.导航应用

2.1 导航切换

首先根据Prism(MVVM)中介绍的方法,引入Prism框架

然后创建图示三个项目,分别引入Prism框架,创建相应的文件夹

 具体代码与WPF Prsim框架(区域)文章中提及相同,可详见WPF Prsim框架(区域)此篇文章.

2.2 导航传参

导航传参要在接收的ViewModel类中继承INavigationAware接口,继承接口后要实现三种方法,方法的执行顺序如注释解释:

   //第一次从main进入pageA 先执行构造器,在执行OnNavigatedTo;
        //第二种情况PageA到PageA OnNavigatedFrom ==> IsNavigationTarget ==> OnNavigatedTo

        //导航目标
        //OnNavigatedTo() 一般用于接收导航参数 navigationContext导航上下文
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            try
            {
                Name = navigationContext.Parameters.GetValue<string>("Name");
                Sex = navigationContext.Parameters.GetValue<bool>("Sex");
                Id = Convert.ToInt32(navigationContext.Parameters["Id"]);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

//控制每次重新导航时,是否创建当前实例的PageAviewModel,当为true时不在重新创建当前实例,为false时重新创建当前实例
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

//导航的来源

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {

        }
     
        }

传参方法在MainViewModel中

    public MainViewModel(IRegionManager regionManager, IRegionNavigationJournal journal)
        {
            OpenCommnd = new DelegateCommand<string>(Open);
            BackCommnd = new DelegateCommand(Back);
            Journal = journal;
            iRegionManager = regionManager;
        }

        private void Open(string obj)
        {
            if (obj.ToString() == "PageB")
            {
                iRegionManager.Regions["con"].RequestNavigate(obj);
            }
            else
            {
//定义导航参数
                NavigationParameters par = new NavigationParameters
                {
                    { "Id", 5 },
                    { "Name", "111" },
                    { "Sex", true }
                };

//通过RequestNavigate()的第三个参数进行传参
//第一个参数 obj为注册的窗体,用户控件或者页面
//第二个参数 跳转时,记录的导航日志

                this.iRegionManager.Regions["con"].RequestNavigate(obj, (callback) =>
                {
                    Journal = callback.Context.NavigationService.Journal;
                }, par);
            }
        }

传参,接收参数的过程中要注意传递的键值准确,

2.3 导航拦截

导航拦截也要在接收的ViewModel类中继承IConfirmNavigationRequest接口,IConfirmNavigationRequest接口继承了INavigationAware接口

比传参多实现一个方法

 public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            bool result = true;
            if (Id==6)
            {
                result = false;
            }
            continuationCallback(result);
        }

continuationCallback(bool)回调一个bool值,如果是true则允许进入下一个界面,false则被拦截.

2.4 导航日志

//通过RequestNavigate()的第三个参数进行传参
//第一个参数 obj为注册的窗体,用户控件或者页面
//第二个参数 跳转时,记录的导航日志

                this.iRegionManager.Regions["con"].RequestNavigate(obj, (callback) =>
                {
//callback.Context当前导航的上下文
//NavigationService 导航服务
//Journal 导航日志
                    Journal = callback.Context.NavigationService.Journal;
                }, par);
            }
        }
  private void Back()
        {
            if (Journal.CanGoBack)
            {
//如果有返回的日志,goback返回,GoForward() 前进 Clear() 清除日志
                Journal.GoBack();
            }
        }

 绑定按钮即可实行日志回退 

 BackCommnd = new DelegateCommand(Back);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉玊则不达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值