一、简介
Region结合Navigation导航,类似https://blog.csdn.net/xpj8888/article/details/83022627的功能。
关于导航,请参考:https://www.cnblogs.com/sunrfun/archive/2013/03/24/2979702.html
- IsNavigationTarget方法:当前的视图模型是否可以处理请求的导航行为,通常用来指定当前的视图/模型是否可以重用。例如,一个显示客户明细的视图可以显示客户a,客户b....等的信息,他们重用同一个视图。
- OnNavigatedTo方法:当前的页面被导航到以后发生,这个函数可以用来处理URI的参数。
- OnNavigatedFrom方法:当前的页面导航到其他页面的时候发生。
二、举例
1、BasicRegionNavigation工程
1.1、App.xaml、App.xaml.cs、MainWindow.xaml.cs(与之前的相同)。
1.2、Bootstrapper.cs:
using Microsoft.Practices.Unity;
using Prism.Unity;
using BasicRegionNavigation.Views;
using System.Windows;
using Prism.Modularity;
using ModuleA;
namespace BasicRegionNavigation
{
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
protected override void ConfigureModuleCatalog()
{
var catalog = (ModuleCatalog)ModuleCatalog;
catalog.AddModule(typeof(ModuleAModule));
}
}
}
1.3、MainWindow.xaml:
<Window x:Class="BasicRegionNavigation.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="350" Width="525">
<DockPanel LastChildFill="True">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" >
<Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button>
<Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button>
</StackPanel>
<ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5" />
</DockPanel>
</Window>
1.4、MainWindowViewModel.cs:
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
namespace BasicRegionNavigation.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private readonly IRegionManager _regionManager;
private string _title = "Prism Unity Application";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
public DelegateCommand<string> NavigateCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);//一旦点击按钮,会将CommandParameter传递进来。
}
/// <summary>
/// //一旦点击按钮,会将CommandParameter传递给navigatePath,并执行Navigate。
/// </summary>
/// <param name="navigatePath"></param>
private void Navigate(string navigatePath)
{
if (navigatePath != null)
_regionManager.RequestNavigate("ContentRegion", navigatePath); //ContentRegion这个区域显示ViewA或ViewB
}
}
}
2、ModuleA项目
2.1、ViewAViewModel.cs、ViewBViewModel.cs、ViewA.xaml.cs、ViewB.xaml.cs(采用默认值,空的,没有写任何东西)。
2.2、ModuleAModule.cs:
using Microsoft.Practices.Unity;
using ModuleA.Views;
using Prism.Modularity;
using Prism.Regions;
using Prism.Unity;
using System;
namespace ModuleA
{
public class ModuleAModule : IModule
{
IRegionManager _regionManager;
IUnityContainer _container;
public ModuleAModule(RegionManager regionManager, IUnityContainer container)
{
_regionManager = regionManager;
_container = container;
}
public void Initialize()
{
_container.RegisterTypeForNavigation<ViewA>();
_container.RegisterTypeForNavigation<ViewB>();
}
}
}
2.3、ViewA.xaml或ViewB.xaml:
<UserControl x:Class="ModuleA.Views.ViewA"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<TextBlock Text="ViewA" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</UserControl>