2012-02-13 35 views
2

我們正在研究使用C#,WPF4,Prism4和MEF的新應用程序。該應用程序包括一個主外殼窗口,該窗口定義了包含一些分離器和五個區域的網格,以及通過查看發現和視圖注入爲各個區域提供UI功能的多個獨立模塊。所有標準的東西,沒有什麼特別的。該應用程序非常基本,一切正常,即模塊在運行時將其視圖正確地提供給shell的區域。在MFC CView中託管時未填充棱鏡外殼區域

我們還需要將相同的shell(以及來自貢獻模塊的UI)託管到我們擁有的大型舊式MFC應用程序中。這是我們遇到問題的地方。 WPF/MFC互操作代碼(使用HwndSource)似乎工作正常,正如shell可以正確顯示爲父MFC CView的子節點一樣,並且具有基本功能,如在shell本身中定義的網格分離器。但是,shell中沒有任何區域正在填充Prism模塊中定義的視圖。調試顯示模塊確實正在加載,但是,注入到每個模塊的IRegionManager實例包含模塊的視圖添加到的零區域。就好像棱鏡沒有意識到shell完全定義了任何區域,因此,試圖將視圖添加到這些「不存在」的區域失敗了。

我們派生了一個新的自定義引導程序類,我們的MFC代碼調用Run()方法。這個引導程序類與獨立應用程序中的等價物相同(工作正常),唯一的區別是我們不再覆蓋InitializeShell()方法,我們只依賴基類實現。通常,這個方法被覆蓋以將Application.Current.MainWindow設置爲shell,然後顯示shell,但是在我們的例子中,沒有當前的應用程序,因爲我們託管在MFC應用程序中。嘗試覆蓋Bootstrapper的運行功能以控制MFC應用程序在適當的時間顯示外殼程序失敗(在shell的區域仍未填充,但外殼仍顯示的情況下失敗)。

是否有人在MFC應用程序中成功使用了Prism 4(具體來說,獲取了shell區域)?任何關於如何在MFC CView中託管帶區域的啓用Prism的shell並讓MFC應用程序啓動引導過程的建議將不勝感激。謝謝。

回答

2

好的,我想通了。在Prism代碼中,我偶然發現了一個名爲OnSetRegionNameCallback()的RegionManager上的方法。此方法根據另一個方法調用IsInDesignMode()的結果有條件地調用CreateRegion()。如果我們在設計模式下爲而不是,則會創建一個區域,否則不會創建區域。仔細檢查IsInDesignMode,發現有三個單獨的測試來確定我們是否處於「設計模式」,如果它們中的任何一個都是真的,則認爲我們處於設計模式。其中一個檢查是Application.Current == null。當然,在MFC應用程序的上下文中,Application.Current實際上是空的,因此確定(錯誤)是我們處於設計模式,因此沒有創建任何區域。

一旦我意識到這一點,進一步的互聯網搜索顯示其他一些人也遇到了同樣的問題。事實上,CodePlex的Prism部​​分(work item #3552)甚至有一個問題與2009年1月發佈的這個確切問題有關。此項工作的貢獻者還建議創建一個虛擬應用程序,以通過「我們是在設計模式?「檢查。請參閱工作項目瞭解更多詳情。我實現了一個類似的解決方法,然後能夠在MFC應用程序的MFC CView中成功託管啓用了Prism的shell及其貢獻模塊。

非常感謝那些在我之前開闢了這條線索並提出瞭解決方法的人。你爲我節省了很多時間!