RegionManager的主要功能有:
1、定义区域
2、维护区域合集
3、提供对区域的访问
//调出区域对区域进行访问
//var region = regionManager.Regions["ContentRegion"];
4、合成视图(给区域指定视图)
5、区域导航
一、定义区域
(1)XMAL代码中直接设置,例如:
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
(2)在代码中指定,首先在XMAL代码中定义控件名称:
<ContentControl x:Name="Ctr" />
之后在MainWindow.cs文件中注册区域:
public MainWindow()
{
InitializeComponent();
RegionManager.SetRegionName(Ctr,"ContentRegion");
}
二、向区域中注册页面
(1)如在MainWindow里边的ContentRegion区域中显示页面ViewB,可在MainWindowViewModel里添加如下代码:
public MainWindowViewModel(IRegionManager regionManager)
{
this.regionManager = regionManager;
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewB));
//var region = regionManager.Regions["ContentRegion"];
}
(2)在执行命令时候切换region区域:
private void Open(string obj)
{
regionManager.Regions["ContentRegion"].RequestNavigate(obj);
}
其中在前端需要的位置绑定Open命令,并传递要打开页面的参数:
<Button Content="打开模块A" Margin="10" Command="{Binding OpenCommand}" CommandParameter="ViewA" />
三、为控件定义区域适配器
官方提供的适配器有:ContentControlRegionAdapter、ItemsControlRegionAdapter、SelectorRegionAdapter
自定义区域适配器(以StackPanel为例):
(1)创建StackPanelRegionAdapter.cs类,代码如下:
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace BlankApp1
{
public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{
public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory)
{
}
//处理动态设置内容的代码
protected override void Adapt(IRegion region, StackPanel regionTarget)
{
//检测视图的变化
region.Views.CollectionChanged += (s, e) =>
{
//动态添加
if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach(FrameworkElement item in e.NewItems)
{
regionTarget.Children.Add(item); // Add the new view to the StackPanel
}
}
};
}
//创建一个Region区域
protected override IRegion CreateRegion()
{
return new Region();
}
}
}
(2)在App.xmal.cs中在初始化时将区域适配器添加进去
protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings registrationAdapterMappings)
{
base.ConfigureRegionAdapterMappings(registrationAdapterMappings);
//动态添加一个区域适配器
registrationAdapterMappings.RegisterMapping(typeof(StackPanel),Container.Resolve<StackPanelRegionAdapter>());
}
刚开始看,如有漏洞,欢迎补充。