Prism:导航(Navigation)
Prism:导航(Navigation)
在普遍的业务场景当中, 必不可少的是页面切换, 而Prism就可以使用Navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证、传递参数、返回上一页、返回下一页等功能。
导航的基本条件
1.注册显示区域
2.注册导航页面
注册显示区域
首先在mainwindowviewmodel或者viewmodel通过构造函数注入IRegionManager,通过regionManger管理显示区域。
注册导航页面
指定ViewModel或添加别名。(app.xaml.cs或者module里面注册)
public void RegisterTypes(IContainerRegistry containerRegistry)
{
//指定ViewModel
containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
//指定ViewModel并且添加别名
containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("CustomName");
}
使用导航
通过区域管理器来管理导航
regionManager.RequestNavigate("RegionName", "ViewName");
- 第一个参数:RegionName,定义的区域名字(xaml中或者Mainwindow里面)
- 第二个参数:ViewName,显示视图名字,比如:ViewA(UserControl),如果是通过按钮来显示,传入参数为ViewName字符串类型就可以了
带参数的导航
如果在显示导航区域时,想要传入参数呢?
NavigationParameters paras = new NavigationParameters();
paras.Add("MsgA","大家好,我是A!");
//regionManager.Regions["ContentRegion"].RequestNavigate(viewName, paras);
regionManager.RequestNavigate("ContentRegion",viewName, paras);
- 第三个参数:为NavigationParameters的参数,是一个键值对
如果在导航区域界面时,怎么接收这些参数呢?
比如上面导航到ViewA,此时可以在ViewAViewModel里面继承INavigationAware或者IConfirmNavigationRequest(继承了前者接口)
继承INavigationAware接口
实现接口的3个方法
- OnNavigatedTo: 导航完成前, 此处可以传递过来的参数以及是否允许导航等动作的控制。
- IsNavigationTarget: 调用以确定此实例是否可以处理导航请求(一般返回true)。否则新建实例。
- OnNavigatedFrom: 当导航离开当前页时, 类似打开A, 再打开B时, 该方法被触发。(拦截)
方法执行流程:
可以看到,想要接收参数,可以在OnNavigatedTo方法中实现
继承IConfirmNavigationRequest接口
在上面实现的三个方法上多实现了一个方法
该方法为切换导航区域时,比如从ViewA到ViewB时,利用此方法可以进行确认是否离开ViewA
执行流程:(当导航到一个区域时)
导航日志记录
这个时候,我们会发现,如果我们导航到了下一个区域,比如ViewB,如果我想要返回到ViewA呢?
IRegionNavigationJournal接口可以记录导航日志,不仅仅是一次,是完整的切换记录,比如A->B->C也是可以返回到A的,类似于撤销
这个导航接口在哪里去记录呢?
依旧还是在请求导航的时候的方法里面里面,每进行一次导航就进行一次记录