【问题标题】:Using a reference to the main Window from a static class - Good practice?使用静态类中对主窗口的引用 - 好的做法?
【发布时间】:2011-01-23 21:39:18
【问题描述】:

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

我做了一个静态类:

 static class UI 
    {
        static public MainWindow window;
    }

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

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

            UI.window = this;
...

现在我可以使用 UI.window.Dispatcher.Invoke(). 访问我的 GUI 组件了

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

谢谢

更新:

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

【问题讨论】:

    标签: c# wpf c#-4.0


    【解决方案1】:

    由于我有其他类需要访问 UI 线程的 Dispatcher 以更新有界列表

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

    提供对 Window 本身的引用可能会导致混淆。这里的意图不是很清楚。

    【讨论】:

    • 这是个好主意。但在这种情况下,一般做法是什么?我看到的所有示例都假设我使用的是 Window 类中的 Dispatcher,而不是其他类中的。
    • Dispatcher 可以来自任何 UI 元素。作为一般做法,请避免使用静态成员。使用 Dispatcher,您可以传递一个成员,但您也可以在顶层执行此操作一次。但是,我可能只在创建您的第一个窗口(或应用程序)时设置一次,然后从那里使用它...
    • 如果主要目标只是获得对 Dispatcher 的访问权限,我强烈建议存储它 - 而不是 Window 类。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果它只是关于调度程序,你可以这样做

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

      【讨论】:

      • 这似乎是在不保留静态引用的情况下访问主调度程序的更简单方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多