【问题标题】:.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 类型一个变量,该变量保存所有表单的最后一个“有效”(从您的应用程序的角度来看)状态。