Loading...
墨滴

龍魂

2021/08/17  阅读:37  主题:红绯

Prism Region

@

什么是Region(区域)?

定义(动态占位符)

简单来说,Region可以理解为View的动态占位符,在View上进行视图占位,就像图书馆占座一样,方便后续注入UI元素。 比如我们可以将我们的程序划分为MenuRegion,Top Region、和Main Region. 在这里插入图片描述

松耦合

由于Region不知道什么会注入自身,正如占好的座位不一定是谁坐一样,所以很好的实现了View和region的松耦合.

在xaml内创建Region

我们可以使用附加属性RegionManager.RegionName在xaml内创建Region。 步骤如下: 首先要在xaml的命名空间上引用prism的库: xmlns:prism="http://prismlibrary.com/" 然后添加一个 <ContentControl prism:RegionManager.RegionName="ContentRegion" /> 即可完成使用RegionManager对Region的创建。

<Window x:Class="Regions.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        Title="Shell" Height="350" Width="525">

    <Grid>
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>

请注意: RegionName 一定是要唯一的!! RegionName 一定是要唯一的!! RegionName 一定是要唯一的!! 重要的事情说三遍!

在Code里面创建Region

使用RegionManager.SetRegionName在Code里面创建Region xaml:

<Window
    x:Class="Regions.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    Title="Shell"
    Width="525"
    Height="350">

    <Grid>
        <ContentControl x:Name="MyContentControl" />
    </Grid>
</Window>

cs:

   public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            RegionManager.SetRegionName(MyContentControl,"ContentRegion");
        }
    }

什么是RegionManager?

RegionManager可以简单理解为Region集合的维护者,用于在应用中创建和注入Region,它提供了对Region的访问途径。在应用程序中,我们可以通过依赖注入IRegionManager来获取。

什么是RegionAdapter?

本质上,它是一个Class,用于将View适配你的Region.类似于充电器的适配器,将电导入到你的手机内,不同手机有不同的适配器。

如果没有提供合适的RegionAdapter,运行其实是会报异常的。之所以按照上面方式创建不报错,因为prism默认提供了4种适配器,分别是:

  • ContentControlRegionAdapter 内容控制区域适配器
  • SelectorRegionAdaptor 选择区域适配器
  • ItemsControlRegionAdapter 区域适配器
  • TabControlRegionAdapter (Silverlight only)适用于tabcontrol

除以上的适配器,我们都需要自定义适配器,不然就会报异常。

创建自定义RegionAdapter

我们可以创建一个StackPanelRegionAdapter 类,然后按以下步骤进行RegionAdapter的创建

  1. 我们需要继承自RegionAdapterBase 类,这里T是指StackPanel
  2. 我们需要重写CreateRegion方法,返回AllActiveRegion、Region、SingleActiveRegion之一即可
  3. 我们需要重写Adapt方法,这个方法才是真正将View适配Region的方法,我们需要将View添加到Region内。
using Prism.Regions;
using System.Windows;
using System.Windows.Controls;

namespace Regions
{
    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();
        }
    }
}

最后我们需要在app.xaml.cs内注册StackPanelRegionAdapter,即可完成自定义区域适配器

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

龍魂

2021/08/17  阅读:37  主题:红绯

作者介绍

龍魂