导航传参
引入using Prism.Regions;命名控件
/// <summary>
/// 打开导航并传参
/// </summary>
/// <param name="obj">要打开的导航模块名</param>
private void Open(string obj)
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Title", "Hello!");
//打开指定导航赋值给名字为“ning”的控件,不传参数
//regionManager.Regions["ning"].RequestNavigate(obj);
//打开指定导航赋值给名字为“ning”的控件,并把参数传过去
regionManager.Regions["ning"].RequestNavigate(obj,keys);
//Callback回调函数
regionManager.Regions["ning"].RequestNavigate(obj, Callback =>
{
},keys);
//第一个参数是目标域名称,第二参数calendarViewUri是一个Uri类型的对象,该对象名称是需要导向View的名称。keys是参数
//regionManager.RequestNavigate("ContentRegion", "HelloView", keys);
}
接收参数,导航拦截,是否每次打开重新创建实列
类继承IConfirmNavigationRequest
继承实现OnNavigatedTo方法
用
navigationContext.Parameters.GetValue(“参数键名”);
可以接收参数
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//判断是否有这个Key
if(navigationContext.Parameters.ContainsKey("Title"))
{
//取出传过来的值
title = navigationContext.Parameters.GetValue<string>("Title");
}
}
继承实现ConfirmNavigationRequest方法,这方法就是用于导航拦截
//这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("确认导航", "温馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
continuationCallback(result);
}
继承实现IsNavigationTarget方法,该方法决定第二次打开是否重新创建,重新new 该实列
//每次导航的时候,改实列用不用重新创建,true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
完整代码
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ModuleA.ViewModels
{
public class ViewAViewModel : BindableBase,IConfirmNavigationRequest
{
private string title { get; set; }
public string Title{
get
{
return title;
}
set
{
value = title;
RaisePropertyChanged();
}
}
public ViewAViewModel()
{
}
//每次导航的时候,改实列用不用重新创建,true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//判断是否有这个Key
if(navigationContext.Parameters.ContainsKey("Title"))
{
//取出传过来的值
title = navigationContext.Parameters.GetValue<string>("Title");
}
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if (MessageBox.Show("确认导航", "温馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
result = false;
continuationCallback(result);
}
}
}
导航日志,返回上一步操作
声明日志变量,用于记录,返回上一次或下一次操作
private IRegionNavigationJournal journal;
在导航回调函数记录操作到日志
regionManager.Regions["ning"].RequestNavigate(obj, callback =>
{
//判断回调函数是否返回成功true
if (callback.Result != null&&(bool)callback.Result)
{
//记录操作日志
journal=callback.Context.NavigationService.Journal;
}
},keys);
返回上一步或者下一步操作
public void Back()
{
//返回上一步,if先判断是否能返回上一步
if(journal.CanGoBack)
journal.GoBack();
//返回下一步,if先判断是否能返回下一步
//if (journal.CanGoForward)
// journal.GoForward();
}
导航日志所有代码
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prism模块化Dome.ViewModels
{
public class MainViewModel: BindableBase
{
private readonly IRegionManager regionManager;
public DelegateCommand<string> OpenCommand { get; private set; }
//声明日志变量
private IRegionNavigationJournal journal;
public DelegateCommand BackCommand { get; private set; }
public MainViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(Open);
BackCommand = new DelegateCommand(Back);
this.regionManager = regionManager;
}
public void Back()
{
//返回上一步,if先判断是否能返回上一步
if(journal.CanGoBack)
journal.GoBack();
//返回下一步,if先判断是否能返回下一步
//if (journal.CanGoForward)
// journal.GoForward();
}
/// <summary>
/// 打开导航并传参
/// </summary>
/// <param name="obj">要打开的导航模块名</param>
private void Open(string obj)
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Title", "Hello!");
//打开指定导航赋值给名字为“ning”的控件,不传参数
//regionManager.Regions["ning"].RequestNavigate(obj);
//打开指定导航赋值给名字为“ning”的控件,并把参数传过去
//regionManager.Regions["ning"].RequestNavigate(obj,keys);
//Callback回调函数
regionManager.Regions["ning"].RequestNavigate(obj, callback =>
{
//判断回调函数是否返回成功true
if (callback.Result != null&&(bool)callback.Result)
{
//记录操作日志
journal=callback.Context.NavigationService.Journal;
}
},keys);
//第一个参数是目标域名称,第二参数calendarViewUri是一个Uri类型的对象,该对象名称是需要导向View的名称。keys是参数
//regionManager.RequestNavigate("ContentRegion", "HelloView", keys);
}
}
}