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); } } }; } 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 { 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的目的应该是让开发者在视图布局上面更加灵活。