如何在棱镜中使用面板作为区域?

时间:2009-12-09 22:14:19

标签: wpf prism panel

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}">

我们怎样才能做到这一点?

1 个答案:

答案 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;
    }
}