使用静态类对主窗口的引用 - 良好实践?

时间:2011-01-23 21:39:19

标签: c# wpf c#-4.0

我有一个名为MainWindow的主窗口类的WPF应用程序。 由于我有其他类需要访问UI线程的Dispatcher来更新有界列表,我找到了这个解决方案:

我做了一个静态课程:

 static class UI 
    {
        static public MainWindow window;
    }

并在app构造函数中添加以下行:

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

            UI.window = this;
...

现在,我可以使用UI.window.Dispatcher.Invoke().

在任何地方访问我的GUI组件

问题是 - 这是一个很好的编程习惯吗? 有没有更好的方法呢?

谢谢

更新

我似乎只有在更新绑定到第三方控件的ObservableCollection时才会抛出异常。我有一个绑定到列表框的另一个静态OC(显示更新的消息),我可以在不使用调度程序的情况下从其他线程更新该消息。 怎么会? 是因为它是静态OC还是与控件有关?

3 个答案:

答案 0 :(得分:4)

  

因为我有其他类需要访问UI线程的Dispatcher来更新有界列表

就个人而言,如果你需要这个,我只会保存对Dispatcher的引用,而不是整个UI。

提供对Window本身的引用可能会引起混淆。这里的意图并不明确。

答案 1 :(得分:4)

一般的情况下,它并不理想 - 如果您希望线程独立,或者您希望垃圾收集来收集窗口,static有一些陷阱 - 但可以说是你可以为你窗口侥幸逃脱,因为那可能基本上是单身,并且持续了应用程序的生命周期。

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

答案 2 :(得分:2)

如果仅关于调度员,你可以这样做

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