自定义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();
}
}
}