繁体   English   中英

使用Dispatcher.Invoke无法更新UI

[英]Trouble updating UI using Dispatcher.Invoke

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

如果您需要任何其他信息,请告诉我。

谢谢。

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

顺便说一句:为什么要转换为ThreadStart? (不重要,只是好奇)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM