2011-01-23 37 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有一些陷阱,如果你希望垃圾收集,收集窗口 - 但可以说你也许可以逃脱它的你主要窗口,因为这可能基本上是单身,并持续应用程序的生命周期。

就我个人而言,我可能不会 - 我会通过属性或构造函数的参数传递它 - 但我有点挑剔。