Prism 4 区域是我们如何在基于 XAML 的解决方案中动态构建用户界面的重要部分。在第 6 章中,我们简要地看了一下RegionManager.RegionName
属性。我们使用这个属性将 Prism 4 区域分配给我们外壳表单中的用户控件。在本章中,我们将更深入地了解 Prism 4 区域,并更好地了解如何在我们的解决方案中使用它们。
什么是 Prism 4 区?
Prism 4 区域是窗口或视图中的占位符,用于标识用户界面的一部分,以便动态注入内容。
区域是如何使用的?
您可能还记得,当我们在第 6 章中讨论 shell 表单时,我们在该项目中将区域添加到 shell 表单中。
清单 ShellLogoTop Shell 表单的 MathRegion
prism:RegionManager.RegionName="MathRegion"
清单 29 中的代码作为外壳形式的数学内容的占位符。容器控件(在这种情况下是 Syncfusion TabControlExt
控件)被添加到没有内容的外壳表单中。清单 29 将控件的RegionName
附加属性设置为MathRegion
。
MathRegion RegionName
属性将作为一个标识符,用于在运行时注入视图。
| | 注意:我们现在将推迟详细讨论 Prism 4 视图注入。我们将在下一章中详细讨论 Prism 4 模块。 |
Prism 4 区域和微软控件
添加带有 Prism 4 区域的微软控件很容易。只需将 Prism 4 库添加到您的窗口或视图中。然后添加一个适当的容器控件,并为该控件添加一个唯一的RegionManager.RegionName
。
有三种类型的微软容器控件可以开箱即用地使用 Prism 4:ContentControl
、ItemsControl
和Selector
。
内容控制
内容控件一次可以使用一个注入的视图。如果已经注入视图的内容控件被注入了新视图,则以前的视图将被新视图替换。内容控件的一个例子是ContentControl
。
项目控制
ItemsControl
可以在单个容器中使用多个注入的项目或视图。ListBox
和ComboBox
控件是项目控件的示例。
选择器
选择器控件也可以在单个容器中使用多个视图。选择器控件的示例有选项卡控件和停靠管理器。
这些控件开箱即用地与 Prism 4 一起工作,因为 Prism 4 框架附带了三个RegionAdapter
实现,旨在与从这三种控件类型派生的微软控件一起工作。
内置 Prism 4 区适配器:
ContentControlRegionAdapter
ItemsControlRegionAdapter
SelectorRegionAdapter
安装 Prism 4 时,会包含这些区域适配器。只要您使用的是从这些类型派生的 Microsoft 控件,您的代码就应该在没有修改的情况下工作。
使用三个区域适配器的微软类型:
System.Windows.Controls.ContentControl
System.Windows.Controls.ItemsControl
System.Windows.Controls.Primitives.Selector
使用带第三方控件的 Prism 4 区域
现在我们已经了解了区域适配器如何与微软控件一起工作,让我们看一个使用第三方控件的例子。在虚拟计算器解决方案中,使用了两个基于微软的内容控件来显示公司徽标和应用程序徽标,这些模块中的每一个都工作正常。
在数学模块的情况下,我们使用 Syncfusion 的TabControlExt
控制。如果我们试图向这个控件添加RegionManager.RegionName
附加属性,我们会得到一个错误。原因是 Prism 4 库中没有与TabControlExt
控件配合使用的RegionAdapter
。那么,我们该如何处理这个问题呢?
| | 提示:大多数第三方控件供应商在其控件套件中提供 RegionAdapter 示例代码。我合作过的至少三家控制套件供应商都是这种情况,包括 Syncfusion。如果您打算在具有第三方控件的解决方案中使用 Microsoft Prism 4,请确保控件供应商的控件在提交到控件套件之前与框架一起工作。 |
同步融合选项卡控件外部区域适配器类
当使用第三方控件时,有必要为想要与 Prism 4 一起使用的控件创建RegionAdapter
类。
| | 注意:这是 Prism 4 中我发现有必要将 Prism 4 配置为与第三方控件一起工作的唯一区域。在所有其他领域,我发现 Prism 4 可以透明地使用这些控件。 |
您可能想知道为什么我们要创建一个特殊的类来处理非微软控件。为了理解为什么这是必要的,让我们看看 Syncfusion TabControlExt
控件的RegionAdapter
类。
清单 30:syncfusiontabctlregionadapter 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Prism.Regions;
using Syncfusion.Windows.Tools.Controls;
using System.Windows;
namespace PRISM4.MAIN.REGION_ADAPTERS
{
public class SyncfusionTabCtrlRegionAdapter
: RegionAdapterBase<TabControlExt>
{
public SyncfusionTabCtrlRegionAdapter
(IRegionBehaviorFactory regionBehaviorFactory)
: base(regionBehaviorFactory)
{
}
protected override void Adapt(IRegion region, TabControlExt regionTarget)
{
region.Views.CollectionChanged += delegate
{
foreach (var tab in region.Views.Cast<FrameworkElement>())
{
if (!regionTarget.Items.Contains(tab))
{
regionTarget.Items.Add(tab);
}
}
};
}
protected override IRegion CreateRegion()
{
return new Region();
}
}
}
首先要考虑的是RegionAdapter
类继承了类型为RegionAdapterBase
的泛型类。这个基类采用了TabControlExt
的有效载荷,即同步融合标签控件。
下一个构造函数注入用于实例化一种类型的IRegionBehaviorFactory
,这个接口源自Microsoft.Practices.Prism.Regions
。RegionBehaviorFactory
类然后被传递给基类。
清单 31:使用构造函数注入并将区域行为工厂传递给基类
public SyncfusionTabCtrlRegionAdapter
(IRegionBehaviorFactory regionBehaviorFactory)
: base(regionBehaviorFactory)
{
}
继承的RegionAdapterBase
类有两个抽象方法:CreateRegion
和Adapt
。
区域适配器使用创建区域方法:
CreateRegion
方法确定要返回的对象类型。它返回三种区域类型之一:
- 地区
- 单个活动区域
- 所有活动区域
区域返回类型
Region
返回类型用于从Selector
类派生的控件。选项卡控件和停靠管理器是使用这种返回类型的一些控件。
单个活动区域返回类型
SingleActiveRegion
返回类型用于从内容控件类派生的控件。内容控件是使用此返回类型的控件之一。
所有活动区域返回类型
AllActiveRegion
返回类型用于从Items
控件类派生的控件。ListBox
和ComboBox
是使用这种返回类型的一些控件。
区域自适应二进制自适应方法
Adapt
方法是 Prism 4 向 Prism 4 区域添加视图和从 Prism 4 区域移除视图。
看看清单 30 中的代码,我们看到两个参数被传递给了该方法:一个IRegion
对象(region
)和一个TabControlExt
对象(regionTarget
)。
每次在区域的“视图”集合中添加、移除或更改视图时,都会触发region.Views.CollectionChanged
事件。
迭代器用于遍历视图集合中的每个选项卡。如果选项卡不在集合中,则会添加它。
在这种情况下,只需要添加选项卡。如果需要,可以添加代码以在移除选项卡时触发。
将区域适配器添加到引导程序
好了,我们有一个RegionAdapter
。我们如何让 Prism 4 知道这件事?这是这个过程的下一步。
配置区域适配器标记方法
bootstrapper
类中的方法之一是ConfigureRegionAdapterMappings
方法。此方法用于向 Prism 4 注册区域适配器。清单 32 是虚拟计算器解决方案使用的ConfigureRegionAdapterMappings
方法的一个示例。
清单 32:引导程序配置区域适配器标记方法
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
if (mappings != null)
{
mappings.RegisterMapping(typeof(TabControlExt),
this.Container.Resolve<SyncfusionTabCtrlRegionAdapter>());
}
return mappings;
}
第一步是从基类的映射对象创建RegionAdapterMappings
对象。
guard 子句用于确保映射对象创建正确。如果映射对象不为空,则TabControlExt
及其关联的RegionAdapter
在映射对象中注册。
通过这种方式,可以根据需要注册任意数量的RegionAdapters
。
底线是RegionAdapter
类向 Prism 4 展示了如何使用不能与 Prism 4 自带的三个区域适配器一起工作的控件。这使得可以扩展可与 Prism 4 框架一起用作视图的控件类型。
摘要
那么,到目前为止,我们学到了什么?Prism 4 区域允许在运行时动态构建用户界面。使用附加属性RegionManager.RegionName
将区域放置在视图中。Microsoft 控件库已经有了与其容器控件一起工作的区域适配器。第三方控件需要自定义RegionAdapter
类才能在 Prism 4 解决方案中用作区域。许多第三方控制公司为他们的控制提供所需的RegionAdapter
代码。
现在我们已经详细了解了 Prism 4 区域,让我们来看看 Prism 4 模块。