无法使用Dispatcher.Invoke更新UI

时间:2011-04-12 23:25:33

标签: c# wpf ribbon-control

我正在开发基于插件的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();

如果您需要任何其他信息,请与我们联系。

感谢。

2 个答案:

答案 0 :(得分:1)

您需要Application.Current.Dispatcher在UI线程上调用它。

btw:你为什么要转向ThreadStart? (不重要,只是好奇)

答案 1 :(得分:0)

如果您只想添加功能区选项卡,则无需为其启动线程(您已将其分派给UI线程),除非您想在线程上执行更多操作。即便如此,使用ThreadPool而不是创建新线程可能更好。无论如何,在这种情况下,我通常会通过插件界面将Dispatcher从主窗口传递到插件,而不是直接访问Application.Current.Dispatcher。使其更加封装,您可以在单元测试中更好地控制它。