Prism框架自定义区域适配器

本文介绍了如何在Prism框架中为StackPanel控件自定义区域适配器,以便在非官方支持的控件上创建区域。通过创建StackPanelRegionAdapter类并实现相关接口,实现动态添加视图到StackPanel中。
摘要由CSDN通过智能技术生成

自定义StackPanel控件作为ContentRegion容器接收器

        Prism官方提供的区域适配器有:ContentControlRegionAdapter,ItemControlRegionAdapter,SelectRegionAdapter,ComboBox,ListBox,Ribbon,TabControl,如果想在别的控件上定义区域则会引发异常。但实际上我们可以在任意控件上定义区域,以StackPanel为例,我们来进行自定义区域适配器的学习。

1.首先创建一个StackPanelRegionAdapter类,继承泛型接口RegionAdapterBase,实现接口,生成构造函数

public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>

2.生成区域函数直接返回new Region();

/// <summary>
/// 重写生成区域方法  直接返回new Region()即可
/// </summary>
/// <returns></returns>
 protected override IRegion CreateRegion()
     {
        return new Region();
     }

3. 动态向stackpanel中添加控件

protected override void Adapt(IRegion region, StackPanel regionTarget)
        {

            region.Views.CollectionChanged += (s, e) =>
              {
                  if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                  {
                      foreach (FrameworkElement item in e.NewItems)
                      {
                          regionTarget.Children.Add(item);
                      }
                  }
              };
        }

4.App.xaml.cs中重写方法

 #region 自定义区域适配器引入项目
        protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
        {
            base.ConfigureRegionAdapterMappings(regionAdapterMappings);

            regionAdapterMappings.RegisterMapping(typeof(StackPanel),Container.Resolve<StackPanelRegionAdapter>());
        }
        #endregion

 5.完整项目代码如下:

StackPanelRegionAdapter.cs

using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace PrismApp
{
    /// <summary>
    /// 继承RegionAdapterBase类
    /// </summary>
    public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="regionBehaviorFactory"></param>
        public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory)
        {

        }

        /// <summary>
        /// 重写适配器方法
        /// </summary>
        /// <param name="region"></param>
        /// <param name="regionTarget"></param>
        protected override void Adapt(IRegion region, StackPanel regionTarget)
        {

            region.Views.CollectionChanged += (s, e) =>
              {
                  if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                  {
                      foreach (FrameworkElement item in e.NewItems)
                      {
                          regionTarget.Children.Add(item);
                      }
                  }
              };
        }
        /// <summary>
        /// 重写生成区域方法  直接返回new Region()即可
        /// </summary>
        /// <returns></returns>
        protected override IRegion CreateRegion()
        {
            return new Region();
        }
    }
}

 

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值