2011-04-12 105 views
0

我正在研究基于插件的WPF应用程序。插件使用多个线程并行加载。其中一个插件是使用WPF RibbonWindow的UI插件。我正在尝试将插件A中的RibbonTab添加到UI插件中。无法使用Dispatcher.Invoke更新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(); 

如果您需要任何其他信息,请让我知道。

谢谢。

回答

0

如果你只是想添加功能区选项卡,你不需要为它启动一个线程(你已经调度它到UI线程),除非你想做更多的事情在线程上。即使这样,使用ThreadPool而不是创建新线程可能会更好。无论如何,在这种情况下,我通常通过插件界面将主窗口中的Dispatcher传递给插件,而不是直接访问Application.Current.Dispatcher。使它更加封装,并且在单元测试中可以更好地控制它。

+0

感谢您的回复。现在我得到一个'System.Reflection.TargetInvocationException:异常已被调用的目标抛出。 ---> System.InvalidOperationException:调用线程无法访问此对象,因为不同的线程拥有它。我尝试使用调度程序创建ribbonwindow,并使应用程序无响应。请指教。 – user26242 2011-04-13 14:06:46

+0

我不得不使用Application.Current.Dispatcher创建每个ribbontab并解决了我的问题。谢谢您的帮助。 – user26242 2011-04-13 20:03:49

1

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

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