prism文档指出有三种区域适配器可用:
ContentControlRegionAdapter 即可。此适配器适应类型
System.Windows.Controls.ContentControl
和派生类的控件。SelectorRegionAdapter 即可。此适配器适应从类
System.Windows.Controls.Primitives.Selector
派生的控件,例如System.Windows.Controls.TabControl
控件。ItemsControlRegionAdapter 即可。此适配器适应类型
System.Windows.Controls.ItemsControl
和派生类的控件。
不幸的是,Panel
不属于任何类别,我希望能够在我的.xaml.cs
中写下这个:
<Canvas cal:RegionManager.RegionName="{x:Static local:RegionNames.MainCanvas}">
我们怎样才能做到这一点?
答案 0 :(得分:2)
这个问题的答案可以在这个非常好的descriptive blog post中找到。
但是,我想要将答案存储在StackOverflow上:)它需要一些搜索才能从Google获得此答案。这是我的代码,它适用于基本的Panel。
第1步 - 创建新的区域适配器
public class PanelHostRegionAdapter : RegionAdapterBase<Panel>
{
public PanelHostRegionAdapter(IRegionBehaviorFactory behaviorFactory)
: base(behaviorFactory)
{
}
protected override void Adapt(IRegion region, Panel regionTarget)
{
region.Views.CollectionChanged += (s, e) =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (FrameworkElement element in e.NewItems)
{
regionTarget.Children.Add(element);
}
}
else if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (FrameworkElement CurrentElement in e.OldItems)
regionTarget.Children.Remove(CurrentElement);
}
};
}
protected override IRegion CreateRegion()
{
return new AllActiveRegion();
}
}
第2步 - 更新引导程序
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
...
}
protected override IModuleCatalog GetModuleCatalog()
{
...
}
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings Mappings = base.ConfigureRegionAdapterMappings();
Mappings.RegisterMapping(typeof(Panel), Container.Resolve<PanelHostRegionAdapter>());
return Mappings;
}
}