1.导航的作用
导航是指在应用程序中在不同的视图(页面)之间进行切换的过程。Prism 提供了一套强大的导航机制,用于管理视图之间的导航流程。Prism 提供了导航服务,它是一个用于管理导航的中心化机制。开发人员可以使用导航服务来请求导航到不同的视图。导航服务负责管理导航历史、处理导航请求并在需要时触发视图的加载和卸载。
大多是应用程序都带有导航功能,直观的示例如下图所示
2.导航的基础操作
创建一个导航至少需要有两个用户控件,分别是控制导航的窗体和导航转跳到的内容,而Prism是基于MVVM的。因此需要写四个文件来创建导航。弹窗在prism架构中有封装的api
Prism框架有默认的导航区域生命字段,在XAML中如下,如此声明后,需要在VM层实现"ContentRegion" 方法
<ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegion" Grid.ColumnSpan="1"/>
首先需要构造函数中有相关的声明,构造函数可以选择多个参数,这里不考虑弹窗,暂时写一个,之后我们实现导航按键的回调方法Open。
private readonly IRegionManager regionManager;
public DelegateCommand<string> OpenCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
OpenCommand = new DelegateCommand<string>(Open);
this.regionManager = regionManager;
}
private void Open(string obj)
{
regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
然后,我们需要修改转跳到的页面,Prism中要求以用户控件的形式。
设定为转跳的页面必须另VM层从基类派生
public class ViewAViewModel : RegionViewModelBase
修改XAML内容,方便我们验证导航的效果,这里假设转跳到的内容为ViewB
<UserControl x:Class="FullApp1.Views.ViewB"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FullApp1.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<TextBlock Text="我是模块B" FontSize="60"></TextBlock>
</Grid>
</UserControl>
最后实现主窗体中的控制按键,分别向导航绑定的回调函数中传参。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel Orientation="Vertical" Grid.Column="0">
<Button Content="打开模块A" Style="{StaticResource MyButton}" CommandParameter="ViewAA"/>
<Button Content="打开模块B" Style="{StaticResource MyButton}" CommandParameter="ViewB"/>
<Button Content="打开模块C" Style="{StaticResource MyButton}" CommandParameter="ViewC"/>
</StackPanel>
<ContentControl Grid.Column="1" prism:RegionManager.RegionName="ContentRegion"/>
</Grid>
启动项目,导航功能的测试如同所示:
3.设置默认导航
Prism项目模板会为模块配置默认导航,更改OnInitialized中的函数参数即可改变进入的页面。
public void OnInitialized(IContainerProvider containerProvider)
{
//设置默认的导航
_regionManager.RequestNavigate(RegionNames.ContentRegion, "ViewA");
}
4.导航日志
Prism的导航带有类似于浏览器的日志功能,目前的项目还不需要这个功能,因此没有学习和记录,后续使用时会补充。