3

是否可以在模块中注册区域适配器?

我的 Shell.xaml 中有一个 ContentControl 设置为区域“MainRegion”,该区域当前填充有包含 AvalonDock 控件的模块。我目前在我的 Shell 应用程序中有 AvalonDock 区域适配器,但想将它放在模块中并自行注册。我想保持这个程序的灵活性,这样如果我们决定使用 AvalonDock 以外的东西,我可以轻松地使用另一个模块,而无需修改我的 Shell 程序集(移除 avalondock 区域适配器)。

我想这样的事情是可能的。有没有人这样做过?

现在在引导程序中是:

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
    RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
    var regionBehaviorFactory = Container.GetExportedValue<IRegionBehaviorFactory>();
    var regionManager = Container.GetExportedValue<IRegionManager>();
    mappings.RegisterMapping(typeof(Pane), new AvalonRegionAdapter(regionBehaviorFactory, regionManager));

    return mappings;
}

这就是我想在模块而不是 Shell 引导程序中执行的操作。

4

1 回答 1

4

答案来自 codeplex http://compositewpf.codeplex.com/discussions/250892

您描述的场景是可能的。尽管自定义区域适配器旨在在 Bootstrapper 的 ConfigureRegionAdapterMappings 方法中的 RegionAdapterMappings 中注册,但可以从模块内注册自定义区域适配器。

例如,您可以通过使用构造函数注入在 Module 类中获取对 RegionAdapterMappings 的引用,并在那里调用 RegisterMapping 方法。这是可能的,因为有一个名为 MefRegionAdapterMappings 的类,它将 RegionAdapterMappings 导出为共享导出。请注意,您应该注意由此可能出现的时间问题。在尝试创建使用该适配器的区域之前,您应该小心注册自定义映射。

于 2011-03-23T17:11:05.457 回答