Navigation区域导航
功能实现
这里以实现按钮打开A和打开B为例
首先创建ViewA和ViewB的页面
在App.xaml.cs中实现对页面的注册
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>("PageA");
containerRegistry.RegisterForNavigation<ViewB>();
}
在MainWindowViewModel中实现对区域内容的设置。以打开A为例,创建按钮,然后实现打开A的函数功能。
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
namespace BlankCoreApp1.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private readonly IRegionManager regionManager;
public DelegateCommand OpenACommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
OpenACommand = new DelegateCommand(OpenA);
this.regionManager = regionManager;
}
private void OpenA()
{
// 设置区域内容为PageA的内容
regionManager.RequestNavigate("ContentRegion", "PageA", param);
}
}
}
实现参数传递
创建一个ViewAViewModel.cs的类,用来实现对ViewA页面参数的传递
其中可以实现以下接口
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Text;
namespace BlankCoreApp1.ViewModels
{
public class ViewAViewModel : BindableBase, INavigationAware
{
/// <summary>
/// 判断是否需要重新创建一个新的实例
/// </summary>
/// <param name="navigationContext"></param>
/// <returns></returns>
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
/// <summary>
/// 导航离开当前页时触发
/// </summary>
/// <param name="navigationContext"></param>
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
/// <summary>
/// 导航完成前接收用户传递的参数以及是否允许导航等控制
/// </summary>
/// <param name="navigationContext"></param>
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}
在MainWindowViewModel.cs中的OpenA函数中实现对参数的传递。这里使用NavigationParameters来创建一个param参数,使用键值对的方式把键值添加进去,使用regionManager.RequestNavigate传递参数。
private void OpenA()
{
// 传递参数 通过RequestNavigate来把param参数传递过去,通过navigationContext来接收参数的值
NavigationParameters param = new NavigationParameters();
param.Add("Value", "Hello");
// 设置区域内容为PageA的内容
regionManager.RequestNavigate("ContentRegion", "PageA", param);
//传递参数的另一种写法
// regionManager.RequestNavigate("ContentRegion", $"PageA?Value=Hello");
}
然后通过ViewModel中的navigationContext来接收参数的值。
private string title;
public string Title
{
get { return title; }
set { title = value;RaisePropertyChanged(); }
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
// 接收键值为Value的值
Title = navigationContext.Parameters.GetValue<string>("Value");
}
实现弹窗提醒
使用IConfirmNavigationRequest接口来实现。在ViewAViewModel.cs中继承该类,使用其中的
ConfirmNavigationRequest方法来实现
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
bool result = true;
if(MessageBox.Show("确认导航?","温馨提示",MessageBoxButton.YesNo) == MessageBoxResult.No)
{
result = false;
}
continuationCallback(result);
}
导航日志
使用IRegionNavigationJournal来实现导航日志的接口。接口实现了GoForward和GoBack方法。
在OpenA或者OpenB中使用arg调用回调函数来实现日志获取。
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
namespace BlankCoreApp1.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private readonly IRegionManager regionManager;
IRegionNavigationJournal journal; // 导航日志的接口
public DelegateCommand OpenACommand { get; private set; }
public DelegateCommand OpenBCommand { get; private set; }
public DelegateCommand GoBackCommand { get; private set; }
public DelegateCommand GoForwordCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
OpenACommand = new DelegateCommand(OpenA);
OpenBCommand = new DelegateCommand(OpenB);
GoBackCommand = new DelegateCommand(GoBack);
GoForwordCommand = new DelegateCommand(GoForword);
this.regionManager = regionManager;
}
private void GoForword()
{
journal.GoForward();
}
private void GoBack()
{
journal.GoBack();
}
private void OpenB()
{
// 设置区域内容为ViewB的内容。 使用回调函数arg来拿到导航日志
regionManager.RequestNavigate("ContentRegion", "ViewB", arg =>
{
journal = arg.Context.NavigationService.Journal;
});
}
private void OpenA()
{
// 传递参数 通过RequestNavigate来把param参数传递过去,通过navigationContext来接收参数的值
NavigationParameters param = new NavigationParameters();
param.Add("Value", "Hello");
// 设置区域内容为PageA的内容 使用回调函数arg来拿到导航日志
regionManager.RequestNavigate("ContentRegion", "PageA",arg=>
{
journal = arg.Context.NavigationService.Journal;
}, param);
//传递参数的另一种写法
// regionManager.RequestNavigate("ContentRegion", $"PageA?Value=Hello");
}
}
}