Prism导航
-
新建视图
UserControl及其ViewModel,被跳转的视图的VM需要实现INavigationAware -
在
App.xaml.cs中注册视图及其ViewModel
// App.xaml.cs
containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
- 在需要放置导航内容处声明
ContentControl及region占位:
<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
="{x:Static ext:PrismManager.MainViewRegionName}" />
</DockPanel>
Region是Prism内部的一个数据结构,它的Name属性是此处在XAML中声明的RegionName(详见下节)。
- 在需要进行导航行为的ViewModel处注入并使用,如:
// ViewModel
public DelegateCommand<string> NavigateCommand { get; private set; }
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);
}
private void Navigate(string navigatePath)
{
if (navigatePath != null)
_regionManager.RequestNavigate("ContentRegion", navigatePath);
}
RegionManager

-
Region对应的是在XAML中声明的ContentControl的附加属性prism:RegionManager.RegionName -
RegionManager管理着所有Region对象,这些Region对象被装到RegionCollection中的列表属性 -
RegionManager中的3个方法UpdateRegions在PrismApplicationBase#Initialize中被调用,它会根据在XAML中声明的RegionName创建Region对象RequestNavigate在需要导航时调用,调用它时会根据 regionName 去 regionCollection 中找到对应的Region对象,并通过集合ActiveViews找到满足条件的 View 实例从而进行ContentControl内容的切换- 可以主动调用
RegisterViewWithRegion进行Region和视图的注册
在进入视图时导航
由于 View 和 ViewModel 的初始化 MvvmHelpers.AutowireViewModel(shell); 先于 Region 的初始化RegionManager.UpdateRegions();,因此在View和ViewModel初始化时找不到相应的 Region 对象。
// PrismApplicationBase.cs
protected virtual void Initialize()
{
// ...
if (shell != null)
{
MvvmHelpers.AutowireViewModel(shell);
RegionManager.SetRegionManager(shell, _containerExtension.Resolve<IRegionManager>());
RegionManager.UpdateRegions();
InitializeShell(shell);
}
// ...
在窗口初始化时,Initilized 事件发生时数据绑定未完成;Loaded 事件发生时数据绑定已经完成。
因此,可以手动注册 Region;也可以在数据绑定结束之后访问 Region。
方法1 Loaded事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
regionManager.RequestNavigate("ContentRegion", "ViewA");
}
方法2 手动注册 Region
// App.xaml.cs
protected override void Initialize()
{
base.Initialize();
var regionManager = Container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
// ViewModel
public MainWindowViewModel(IRegionManager regionManager)
{
regionManager.RequestNavigate("ContentRegion", "ViewA");
}
方法3 Dispatcher
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
regionManager.RequestNavigate("ContentRegion", "ViewA");
}));
浙公网安备 33010602011771号