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的创建
- 我们需要继承自RegionAdapterBase 类,这里T是指StackPanel
- 我们需要重写CreateRegion方法,返回AllActiveRegion、Region、SingleActiveRegion之一即可
- 我们需要重写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>() );
}
主题测试文章,只做测试使用。发布者:admin,转转请注明出处:http://onebyone.icu/2024/09/30/prism-region/