我们正在开发一个使用 C#、WPF4、Prism4 和 MEF 的新应用程序。该应用程序包含一个主 shell 窗口,它定义了一个带有一些拆分器和五个区域的网格,以及许多单独的模块,这些模块通过视图发现和视图注入将 UI 功能贡献给各个区域。所有标准的东西,没有异国情调。该应用程序非常基础,一切正常,即模块在运行时正确地将它们的视图贡献给 shell 的区域。
我们还需要将相同的 shell(以及来自贡献模块的 UI)托管到我们拥有的大型遗留 MFC 应用程序中。这就是我们遇到问题的地方。WPF/MFC 互操作代码(使用 HwndSource)似乎工作正常,这一点可以从 shell 正确显示为父 MFC CView 的子级并具有基本功能(如在 shell 本身中定义的网格拆分器)中得到证明. 但是,外壳中的任何区域都没有填充 Prism 模块中定义的视图。调试显示模块确实正在加载,但是,注入到每个模块的 IRegionManager 实例包含零个区域供模块添加其视图。就好像 Prism 根本不知道外壳定义了任何区域,因此,
我们派生了一个新的自定义引导程序类,我们的 MFC 代码在该类上调用 Run() 方法。这个引导程序类与独立应用程序中的等效类相同(工作正常),唯一的区别是我们不再重写 InitializeShell() 方法,我们只依赖基类实现。通常,此方法会被覆盖以将 Application.Current.MainWindow 设置为 shell,然后显示 shell,但是,在我们的示例中,没有当前应用程序,因为我们托管在 MFC 应用程序中。覆盖引导程序的运行功能以将控制权交还给 MFC 应用程序以在适当的时间显示外壳的各种尝试都失败了(在外壳的区域仍然未填充但外壳仍然显示的意义上失败)。
是否有人在 MFC 应用程序中成功使用了 Prism 4(特别是填充了 shell 区域)?任何关于如何在 MFC CView 中托管具有区域的 Prism 外壳并让 MFC 应用程序启动引导过程的建议将不胜感激。谢谢。