0

私はプラグインベースのWPFアプリケーションに取り組んでいます。プラグインは、複数のスレッドを使用して並列にロードされます。プラグインの1つは、WPFリボンウィンドウを使用するUIプラグインです。プラグインAからUIプラグインにRibbonTabを追加しようとしています。

呼び出し元のスレッドはRibbonWindowを所有していないため、RibbonWindowでDispatcher.Invokeを使用しています。残念ながら、デリゲート内のコードが呼び出されることはありません。アプリケーションは引き続き応答しますが、タブは追加されていません。

とにかく、別のプラグインからUIスレッドにアクセスできますか?リボンウィンドウでの操作にそのスレッドを使用するために、アプリケーション全体で存続できるスレッドを作成できますか?

 System.Threading.ThreadStart start = delegate()
        {
            log.Debug(Thread.CurrentThread.ManagedThreadId);

            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,  (ThreadStart)delegate() {
                    log.Debug(Thread.CurrentThread.ManagedThreadId);
                    ribbonRoot.Items.Add(myRibbonTab);
                });
            }
            else {
                log.Debug("We have access add directly.");
            }

        };

        new Thread(start).Start();

追加情報が必要な場合はお知らせください。

ありがとう。

4

2 に答える 2

1

Application.Current.DispatcherUIスレッドで呼び出す必要があります。

ところで:なぜThreadStartにキャストしているのですか?(重要ではありません、ただ好奇心が強いです)

于 2011-04-12T23:38:45.690 に答える
0

リボンタブを追加するだけの場合は、スレッドでさらに実行したいことがない限り、そのスレッドを開始する必要はありません(すでにUIスレッドにディスパッチしています)。ThreadPoolそれでも、新しいスレッドを作成する代わりに使用する方がよい場合があります。とにかく、このようなシナリオでは、私は通常、Dispatcherに直接アクセスするのではなく、プラグインインターフェイスを介してメインウィンドウからプラグインにを渡しますApplication.Current.Dispatcher。よりカプセル化され、単体テストでより適切に制御できるようになります。

于 2011-04-12T23:48:59.260 に答える