【问题标题】:.Net: maintain form windowState when navigate to different forms.Net:导航到不同表单时维护表单 windowState
【发布时间】:2011-12-29 09:30:59
【问题描述】:

在我的应用程序中,用户可以从一个表单导航到另一个表单,依此类推。所以我想维护每个表单的 WindowState 。我的意思是,如果 form1 处于正常模式,那么下一个 form2 应该以正常模式打开,如果 form1 处于最大化模式,那么 form2 应该以最大化模式打开。当用户导航到以前的表单时,同样的方法也适用。我没有使用 MDI 父 - 子。

一种方法如下

frmLogin form = new frmLogin();
form.WindowState = this.WindowState;
form.Show();
this.Hide();

但我认为这种方法并不好。在这种情况下,我必须维护对新表单的先前表单引用,因此当新表单关闭时,前一个表单会占用新表单 windowState

请提出更好的替代方案

【问题讨论】:

    标签: c# .net winforms windowstate


    【解决方案1】:

    有一个存储 WindowState 信息的中心位置(例如,FormStateManager 类的对象),可用于您的每个窗体。您可以使用单例模式在程序中只包含一个 FormStateManager 对象,或者在每个 Form 的构造函数中传递正确的对象。每当一个表单更改为 WindowState 时,必须通知 FormStateManager 对象,例如在 Resize 事件中。

    【讨论】:

      【解决方案2】:

      您可以使用当前的WindowState 保留一个全局变量(某个类上的静态变量)。当窗体的窗口状态改变时,您设置该变量,当您创建一个新窗体(例如在构造函数中)时,您从该变量中读取窗口状态。

      请注意,没有WindowStateChanged 事件。但是,更改窗口状态会触发Resize 事件,因此您可以使用它。

      您甚至可以将所有这些放在一个基类中:

      public class FormBase : System.Windows.Forms.Form
      {
          private static FormWindowState _windowState = FormWindowState.Normal;
      
          public FormBase()
          {
              WindowState = _windowState;
          }
      
          protected override void OnResize(EventArgs e)
          {
              _windowState = WindowState;
      
              base.OnResize(e);
          }
      }
      

      而且如果你想真正花哨,你可以同步所有表单的表单状态:

      public class FormBase : System.Windows.Forms.Form
      {
          private static List<FormBase> _allForms = new List<FormBase>();
          private static FormWindowState _windowState = FormWindowState.Normal;
      
          protected override void OnLoad(EventArgs e)
          {
              base.OnLoad(e);
      
              _allForms.Add(this);
      
              WindowState = _windowState;
          }
      
          protected override void Dispose(bool disposing)
          {
              _allForms.Remove(this);
      
              base.Dispose(disposing);
          }
      
          protected override void OnResize(EventArgs e)
          {
              _windowState = WindowState;
      
              foreach (var form in _allForms)
              {
                  if (form != this)
                  {
                      form.WindowState = WindowState;
                  }
              }
      
              base.OnResize(e);
          }
      }
      

      【讨论】:

        【解决方案3】:

        在您采用的方法中没有发现任何问题。您有 FormWindowState 类型一个变量,该变量保存所有表单的最后一个“有效”(从您的应用程序的角度来看)状态。

        【讨论】:

          猜你喜欢
          • 2018-01-26
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多