这次学习Regions。Regions可以实现UI区域分区,不同的UI组件化。所以页面可以由不同的页面组合而成,动态加载,非常灵活,用起来好爽。
新建一个WPF项目
新建一个类:
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();
}
}
这里重写了一个适配器,用于stackpanel的适配,官方关于UI的原装适配器比较少。不过重写也比较简单,可以参考void adapt()方法。
修改app.xaml.cs
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
return Container.Resolve(typeof(MainWindow)) as MainWindow;
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings)
{
base.ConfigureRegionAdapterMappings(regionAdapterMappings);
regionAdapterMappings.RegisterMapping(typeof(StackPanel), Container.Resolve<StackPanelRegionAdapter>());
}
}
这里重写了适配器的配置方法,并注册到容器里面。
mainwindow.xaml加入语句:
<StackPanel prism:RegionManager.RegionName="ContentRegion" />
<Window x:Class="CustomRegions.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CustomRegions"
xmlns:prism="http://prismlibrary.com/"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
运行,通过