0

我正在开发基于插件的 WPF 应用程序。插件使用多个线程并行加载。其中一个插件是使用 WPF RibbonWindow 的 UI 插件。我正在尝试将插件 A 中的 RibbonTab 添加到 UI 插件。

由于调用线程不拥有 RibbonWindow,因此我在 RibbonWindow 上使用 Dispatcher.Invoke。不幸的是,委托中的代码永远不会被调用。该应用程序仍然响应,但未添加选项卡。

无论如何我可以从另一个插件访问 UI 线程吗?我可以有一个线程可以在我的应用程序中一直保持活动状态,以便我使用该线程在 RibbonWindow 上进行操作吗?

 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 回答