如何使用我的WPF应用程序覆盖Prism中的默认区域管理器实现?

时间:2018-03-03 01:59:07

标签: c# wpf prism prism-6

我正在尝试实现一个新的基于WPF Prism 6的应用程序。

Prism为RegionManager接口提供了一个很好的IRegionManager实现,允许我与区域进行交互并为它们构建视图。

我编写了一个简单的类,它扩展了RegionManager类和IRegionManager接口,为我的区域提供了一个很好的包装。

在我的主视图中,我使用XAML代码创建了5个区域,如此

<ContentControl DockPanel.Dock="Bottom"
                        prism:RegionManager.RegionName="{x:Static foundation:RegionNames.BottomRegion}" />

我的ICoreRegionManager界面如下所示

public interface ICoreRegionManager : IRegionManager
{
    IRegion GetMainRegion();
    IRegion GetTopRegion();
    IRegion GetLeftRegion();
    IRegion GetRightRegion();
    IRegion GetBottomRegion();

    IRegionManager AddToMainRegion(object view);
    IRegionManager AddToTopRegion(object view);
    IRegionManager AddToLeftRegion(object view);
    IRegionManager AddToRightRegion(object view);
    IRegionManager AddToBottomRegion(object view);
}

如何使用ICoreRegionManager代替IRegionManager

以下是我在UnityBootstrapper

中配置UI容器的方法
protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    RegisterTypeIfMissing(typeof(IUnitOfWork), typeof(EntityUnitOfWork), false);
    RegisterTypeIfMissing(typeof(ICoreRegionManager), typeof(CoreRegionManager), true);

}

当我尝试访问我的区域时,我发现区域未找到错误。以下是我尝试将视图构建到我的主要区域的方式。

var regionManager = Container.Resolve<ICoreRegionManager>();
regionManager.AddToMainRegion(view);

当我调试应用时,我可以看到regionManager.Regions集合中没有区域。似乎区域仅在RegionManager实例中注册。此外,当我(Container.Resolve<IRegionManager>()).Regions;时,我可以按预期看到我的5个区域。

如何用自己的方法覆盖prism的区域管理器?

1 个答案:

答案 0 :(得分:1)

来自文件https://msdn.microsoft.com/en-us/library/gg430866(v=pandp.40).aspx

  

替换默认棱镜库类型

     

有时您可能需要更改或扩展底层证券   为应用程序实现Prism库类型。因为   Prism Library依赖于依赖注入,可以替换类型   在引导序列期间以及您的应用程序和   Prism Library将使用新类型。

在你的bootstrapper类中执行以下操作

protected override void ConfigureContainer()
{
    // First you register your own implementation of ICoreRegionManager
    RegisterTypeIfMissing(typeof(ICoreRegionManager), typeof(CoreRegionManager), true);

    // Then you register your own implementation of IRegionManager
    RegisterTypeIfMissing(typeof(IRegionManager), typeof(CoreRegionManager), true);



    // Last step is to call the base ConfigureContainer() method to register the rest
    base.ConfigureContainer();
}