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

C# 使用静态类中的主窗口引用-良好实践?,c#,wpf,c#-4.0,C#,Wpf,C# 4.0,我有一个WPF应用程序,它的主窗口类叫做MainWindow。 由于我有其他类需要访问UI线程的Dispatcher来更新有界列表,因此我找到了以下解决方案: 我做了一个静态类: static class UI { static public MainWindow window; } 并在应用程序构造函数中添加了以下行: public partial class MainWindow : Window { public MainWi

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

我做了一个静态类:

 static class UI 
    {
        static public MainWindow window;
    }
并在应用程序构造函数中添加了以下行:

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

            UI.window = this;
...
现在,我可以使用
UI.window.Dispatcher.Invoke()。

问题是——这是一种好的编程实践吗? 有没有更好的方法

多谢各位

更新:

我似乎只有在更新绑定到第三方控件的ObservableCollection时才会引发异常。我将另一个静态OC绑定到一个列表框(以显示更新的消息),我可以从其他线程更新该OC,而无需使用dispatcher。 怎么会? 是因为它是静态OC还是与控件相关

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

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

提供对窗口本身的引用可能会导致混淆。这里的意图并不那么清楚。

在一般情况下,这并不理想-
静态
有一些缺陷,如果您希望线程是独立的,或者如果您希望垃圾收集来收集窗口-但可以说您可以为主窗口摆脱它,因为这可能本质上是单例的,并且持续应用程序的生命周期


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

如果只是关于调度器,您可以这样做

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

这是个好主意。但这种情况下的一般做法是什么?我看到的所有示例都假设我使用的是Window类中的Dispatcher,而不是其他类中的Dispatcher。Dispatcher可以来自任何UI元素。一般来说,避免使用静态成员。使用Dispatcher,您可以传入一个成员,但您也可以在顶层执行一次。但是,我可能只会在创建第一个窗口(或应用程序)时设置一次,然后从那里使用它……但是,如果主要目标只是访问调度程序,我强烈建议存储它,而不是存储窗口类。这似乎是在不保留静态引用的情况下访问主调度程序的更简单方法