wpf 如何将Panel用作Prism中的Region?

ykejflvf  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(135)

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

我们如何才能做到这一点?

qjp7pelc

qjp7pelc1#

这个问题的答案可以在这个非常好的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 -更新 Bootstrap **

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

相关问题