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);

猜你喜欢

转载自blog.csdn.net/qq_57212959/article/details/132027278