2011-01-23 61 views
2

我有一個名爲MainWindow的主窗口類的WPF應用程序。 因爲我有需要訪問UI線程的調度來更新界列出了其他班,我發現這個解決方案:從靜態類中使用對主窗口的引用 - 良好實踐?

我做了一個靜態類:

static class UI 
    { 
     static public MainWindow window; 
    } 

而在添加以下行應用程序的構造函數:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      UI.window = this; 
... 

現在我可以用UI.window.Dispatcher.Invoke().

訪問我的GUI隨處可見的部件問題是 - 這是一個很好的編程習慣嗎? 有沒有更好的方法呢?

謝謝

更新:

我似乎只有當我更新這勢必第三方控制一個ObservableCollection來獲得拋出的異常。我有另一個靜態OC綁定到列表框(以顯示更新的消息),我可以從其他線程更新一個不使用調度程序。 怎麼回事? 是因爲它的靜態OC還是與控件有關?

回答

2

如果只有對調度員,你可以做到這一點

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate() 
    { 
    }); 
4

因爲我有其他類需要訪問UI線程的調度來更新界列表

個人而言,如果你需要這個,我只想保存到調度員參考,不整個UI。

提供對窗口本身的引用可能會引起混淆。這裏的意圖不太清楚。

+0

那是一個好主意。但是這種情況下的一般做法是什麼?我看到的所有示例都假定我使用的是Window類中的Dispatcher,而不是其他類中的Dispatcher。 – Sol 2011-01-23 21:54:41

+0

分派器可以來自任何UI元素。作爲一種慣例,避免使用靜態成員。使用Dispatcher,你可以傳入一個成員,但是你也可以在頂層進行一次這樣的事情。但是,我可能只是在創建第一個窗口(或應用程序)時將其設置一次,然後從那裏使用它... – 2011-01-23 21:55:57

4

一般情況下,是不理想的 - 如果你期望線程是獨立的,或者static有一些陷阱,如果你希望垃圾收集,收集窗口 - 但可以說你也許可以逃脫它的你主要窗口,因爲這可能基本上是單身,並持續應用程序的生命週期。

就我個人而言,我可能不會 - 我會通過屬性或構造函數的參數傳遞它 - 但我有點挑剔。