2

現在、C#、WPF4、Prism4、およびMEFを使用する新しいアプリケーションに取り組んでいます。このアプリケーションは、いくつかのスプリッターと5つの領域を備えたグリッドを定義するメインシェルウィンドウと、ビューの検出とビューの挿入を通じてさまざまな領域にUI機能を提供する多数の個別のモジュールで構成されます。すべての標準的なもの、エキゾチックなものは何もありません。アプリケーションは非常に基本的であり、すべてが正常に機能します。つまり、モジュールは実行時にシェルの領域にビューを正しく提供します。

また、同じシェル(および貢献するモジュールのUI)を大規模なレガシーMFCアプリケーションでホストする必要があります。ここで問題が発生します。WPF / MFC相互運用コード(HwndSourceを使用)は正常に機能しているようです。これは、シェルが親MFC CViewの子として正しく表示され、シェル自体で定義されるグリッドスプリッターなどの基本的な機能を備えていることからもわかります。 。ただし、シェル内のどの領域にも、Prismモジュールで定義されたビューが入力されていません。デバッグは、モジュールが実際にロードされていることを示していますが、各モジュールに注入されるIRegionManagerインスタンスには、モジュールがビューを追加するためのゼロ領域が含まれています。Prismは、シェルが領域をまったく定義していないことを認識していないかのようです。その結果、

MFCコードがRun()メソッドを呼び出す新しいカスタムブートストラッパークラスを派生させました。このブートストラッパークラスは、スタンドアロンアプリケーションの同等のクラス(正常に動作します)と同じです。唯一の違いは、InitializeShell()メソッドをオーバーライドせず、基本クラスの実装に依存していることです。通常、このメソッドは、Application.Current.MainWindowをシェルに設定してからシェルを表示するためにオーバーライドされますが、この場合、MFCアプリ内でホストされているため、現在のアプリケーションはありません。Bootstrapperの実行機能をオーバーライドして、適切なタイミングでシェルを表示するためにMFCアプリに制御を戻すさまざまな試みが失敗しました(シェルの領域がまだ入力されていないという意味で失敗しましたが、シェルはまだ表示されています)。

MFCアプリケーション内でPrism4を正常に使用した(具体的には、シェル領域を設定した)人はいますか?MFC CView内のリージョンでPrism対応シェルをホストし、MFCアプリケーションにブートストラッププロセスを開始させる方法に関するアドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

2

さて、私はそれを理解しました。Prismコードを丹念に調べてみると、RegionManagerでOnSetRegionNameCallback()というメソッドに出くわしました。このメソッドは、別のメソッド呼び出しIsInDesignMode()の結果に基づいて、条件付きでCreateRegion()を呼び出します。デザインモードでない場合はリージョンが作成され、そうでない場合はリージョンが作成されません。IsInDesignModeを詳しく調べると、「デザインモード」であるかどうかを判断するために、3つの別々のテストが行​​われ、いずれかが当てはまる場合は、デザインモードであると見なされます。これらのチェックの1つは、Application.Current==nullの場合でした。もちろん、MFCアプリケーションのコンテキストでは、Application.Currentは実際にnullであるため、(誤って)設計モードであると判断されたため、リージョンは作成されませんでした。

私がこれに気づいたら、さらにインターネット検索を行ったところ、他の多くの人々が同じ問題に遭遇したことがわかりました。実際、2009年1月にさかのぼるこの正確な問題に関連するCodePlexのPrismセクション(作業項目#3552 )に記録された問題もあります。この作業項目の寄稿者は、 「私たちはデザインモードですか?」小切手。詳細については、作業項目を参照してください。同様の回避策を実装した後、Prism対応シェルとその貢献モジュールをMFCアプリケーションのMFCCViewで正常にホストすることができました。

私の前でこの道を切り開き、回避策を特定して提案してくれた人々に感謝します。あなたは私に多くの時間を節約してくれました!

于 2012-02-14T17:45:46.823 に答える