2

我们正在开发一个使用 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 应用程序启动引导过程的建议将不胜感激。谢谢。

4

1 回答 1

2

好吧,我想通了。煞费苦心地浏览 Prism 代码,我在 RegionManager 上发现了一个名为 OnSetRegionNameCallback() 的方法。此方法根据另一个方法调用 IsInDesignMode() 的结果有条件地调用 CreateRegion()。如果我们不在设计模式下,则创建一个区域,否则不创建任何区域。仔细检查 IsInDesignMode 发现,我们进行了三个单独的测试来确定我们是否处于“设计模式”,如果其中任何一个为真,则认为我们处于设计模式。其中一项检查是 Application.Current == null。当然,在 MFC 应用程序的上下文中,Application.Current 确实为空,因此(错误地)确定我们处于设计模式,因此从未创建任何区域。

一旦我意识到这一点,进一步的互联网搜索显示许多其他人也遇到了同样的问题。事实上,CodePlex 的 Prism 部分(工作项 #3552)中甚至记录了一个与此确切问题相关的问题,该问题可追溯到 2009 年 1 月。该工作项的贡献者还建议创建一个虚拟应用程序以通过“我们处于设计模式吗?” 查看。请参考工作项目以获取更多详细信息。我实现了一个类似的解决方法,然后能够成功地将启用 Prism 的 shell 及其贡献模块托管在 MFC 应用程序的 MFC CView 中。

感谢那些在我之前开辟这条道路并确定并提出解决方法的人。你为我节省了很多时间!

于 2012-02-14T17:45:46.823 回答