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