Skip to content

Files

Latest commit

03035da · Jan 9, 2022

History

History
208 lines (131 loc) · 9.82 KB

08.md

File metadata and controls

208 lines (131 loc) · 9.82 KB

八、Prism 4 区域

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:ContentControlItemsControlSelector

内容控制

内容控件一次可以使用一个注入的视图。如果已经注入视图的内容控件被注入了新视图,则以前的视图将被新视图替换。内容控件的一个例子是ContentControl

项目控制

ItemsControl可以在单个容器中使用多个注入的项目或视图。ListBoxComboBox控件是项目控件的示例。

选择器

选择器控件也可以在单个容器中使用多个视图。选择器控件的示例有选项卡控件和停靠管理器。

这些控件开箱即用地与 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.RegionsRegionBehaviorFactory类然后被传递给基类。

清单 31:使用构造函数注入并将区域行为工厂传递给基类

        public SyncfusionTabCtrlRegionAdapter
               (IRegionBehaviorFactory regionBehaviorFactory)
               : base(regionBehaviorFactory)
               {
               }

继承的RegionAdapterBase类有两个抽象方法:CreateRegionAdapt

区域适配器使用创建区域方法:

CreateRegion方法确定要返回的对象类型。它返回三种区域类型之一:

  • 地区
  • 单个活动区域
  • 所有活动区域

区域返回类型

Region返回类型用于从Selector类派生的控件。选项卡控件和停靠管理器是使用这种返回类型的一些控件。

单个活动区域返回类型

SingleActiveRegion返回类型用于从内容控件类派生的控件。内容控件是使用此返回类型的控件之一。

所有活动区域返回类型

AllActiveRegion返回类型用于从Items控件类派生的控件。ListBoxComboBox是使用这种返回类型的一些控件。

区域自适应二进制自适应方法

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 模块。