2011-04-12 66 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? (不重要,只是好奇)