私は今1週間MEFを手に入れ、MEFからインポートされたコントロールをロードするWPFアプリケーションを構築しようとしています。
WPFアプリケーションプロジェクトを作成し、デフォルトのウィンドウとアプリケーション起動URIを削除しました。次に、アプリケーションの起動イベントを処理して、アプリケーションを作成しました。
public partial class App : Application, IPartImportsSatisfiedNotification
{
{...}
private void App_Startup(object sender, StartupEventArgs e)
{
this.Compose();
}
public void Compose()
{
try
{
globalCatalog.Catalogs.Add(new DirectoryCatalog(extensionsDirectoryPath));
CompositionContainer container = new CompositionContainer(globalCatalog);
container.ComposeParts(this);
}
catch (Exception ex)
{
// Do something
}
}
{...}
}
実際、インポートが満たされた後にオブジェクトをデバッグおよび監視すると、すべてが私が望むように階層的に正常に構成されます。しかし、アプリケーションのMainWindowを表示しようとすると、MainWindow.Show()呼び出しで例外がスローされます。
「指定された要素はすでに別の要素の論理的な子です。最初に切断してください。」
OnImportsSatisfiedメソッドのコードは、MEFメカニズムを使用していないときに機能しているため、問題ないように見えますが、次のようになります。
public void OnImportsSatisfied()
{
Window mainWindow = new Window();
mainWindow.Content = this.importedControl;
this.MainWindow = mainWindow;
this.MainWindow.Show();
}
MEFでコントロールをインポートしない場合、これは完全に機能するという事実を主張します。驚くべきことは、このコードも機能しないことです。
Window mainWindow = new Window();
//mainWindow.Content = this.importedControl;
this.MainWindow = mainWindow;
this.MainWindow.Show();
したがって、ComposePartsは、実際のアプリケーションインスタンスで動作する唯一のメンバーであるため、それが言うことよりも少し多くのことを行っているのではないかと思います。
誰かが私を助けてくれることを願っています(グレン?)。ありがとう。
編集:
パーツからIPartImportsSatisfiedNotificationインターフェイスを削除しても、例外がスローされず、ウィンドウが表示されることを発見しました。ただし、もちろん、ウィンドウのDataContextを関連するインポートされたビューモデルに設定するためにこのOnImportsSatisfiedメソッドが必要なため、ウィンドウは空です。