3

私は今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メソッドが必要なため、ウィンドウは空です。

4

2 に答える 2

1

WPFアプリケーションフレームワーク(WAF)のサンプルアプリケーションは、 WPFアプリケーション内でMEFを使用する方法を示しています。

于 2010-07-30T18:51:15.313 に答える
0

私はついに、デフォルトのImportAttributeコンストラクターを使用してWPFユーザーコントロールをインポートしていることを発見しました。これは、エクスポート中に作成ポリシーが指定されていない場合、実際にはクラスの共有インスタンスを作成します。また、コントロールの多くが同じインターフェイスを実装していて、ビューでそれらをバインドしていたため、実際には、この共有ユーザーコントロールインスタンスをさまざまなビジュアル要素に追加しようとしていましたが、これはWPFでは許可されていません(例外)。

RequiredCreationPolicyをNonSharedに設定してインポートにマークを付けたところ、すべてが正常に戻りました。それはすべてMEFを学ぶことについてでした...

于 2010-07-16T13:28:42.583 に答える