Prism Step3 CustomRegions

Prism系列的第三篇,我的更新速度也是有点慢,大家凑活看吧,这一片主要讲自定义占位符的使用,Regions是定义在应用UI中的逻辑占位符(在Shell或者在其它的视图中),视图会在其中显示。简单的说,就是一个容器(区域适配器),用来装载Views。功能和Panel控件差不多。视图可以以编程的方式或者自动被显示在Region中。

说明

1 . Regions允许在不需要改变程序逻辑的情况下更新应用UI的布局。

2 . 很多普通的控件都当做regions来使用,允许视图自动在控件中显示,就像ContentControl,ItemsControl,ListBox或者TabControl 。 但是StackPanel就不能直接作为Regions来使用

3 . Prism也支持用regions来实现导航。

4 . Regions可以通过RegionManager组件定位于其它组件中,RegionManager使用 RegionAdapter和RegionBehavior组件调整某个regions中显示的视图.

实例

Prism-Samples-Wpf 官方教程的第三篇就是讲上面如何把一个不能作为 Regions 的布局容器实现 Regions 功能,你需要为一个将被用作Region的添加RegionAdapter(适配器)。RegionAdapter的作用是为特定的控件创建相应的Region,并将控件与Region进行绑定,然后为Region添加一些行为。一个RegionAdapter需要实现IRegionAdapte接口,如果你需要自定义一个RegionAdapter,可以通过继承RegionAdapterBase类来省去一些工作。

我们看到官方的教程中有一个叫做 StackPanelRegionAdapter.cs 的类,这个类其实就是为StackPanel建立了Region

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using Prism.Regions;
using System.Windows;
using System.Windows.Controls;

namespace Regions.Prism
{
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 element in e.NewItems)
{
regionTarget.Children.Add(element);
}
}

//handle remove
};
}

protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
}
}

我们来看一下这个类,首先这个类继承自 RegionAdapterBase 顶级泛型区域适配器类,并且指明类型为 StackPanel,接下来有一个 适配器 Adapt 方法,这个方法就是用于当区域有新内容的时候,进行一个适配工作(其实就是添加元素到容器中)

我们来看 Bootstrapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using Microsoft.Practices.Unity;
using Prism.Regions;
using Prism.Unity;
using Regions.Prism;
using Regions.Views;
using System.Windows;
using System.Windows.Controls;

namespace Regions
{
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<MainWindow>();
}

protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
mappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
return mappings;
}
}
}

这里有一个重写方法,ConfigureRegionAdapterMappings 这个就是用于配置修改一些默认的区域适配器的,使不支持 Regions 支持,这样的话 StackPanel 控件就支持 Regions 了。

我们可以测试一下,在 MainWindow 中关联视图和区域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using Prism.Regions;
using System.Windows;

namespace Regions.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

RegionManager regionManager = new RegionManager();
for (int i = 0; i < 10; i++)
{
regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}
}
}
}

运行就可以看到,原本不支持 regions 的 stackpanel容器放下了 十个视图,Prism官方推出,RegionAdapter的目的应该是让开发者在视图布局上面更加灵活。

评论