我正在研究基于插件的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();
如果您需要任何其他信息,请让我知道。
谢谢。
感谢您的回复。现在我得到一个'System.Reflection.TargetInvocationException:异常已被调用的目标抛出。 ---> System.InvalidOperationException:调用线程无法访问此对象,因为不同的线程拥有它。我尝试使用调度程序创建ribbonwindow,并使应用程序无响应。请指教。 – user26242 2011-04-13 14:06:46
我不得不使用Application.Current.Dispatcher创建每个ribbontab并解决了我的问题。谢谢您的帮助。 – user26242 2011-04-13 20:03:49