在我应用程序中,用户可以导航到一个表单和另一个表单,依此类推。所以我想维护每个表单的WindowState。我的意思是,如果form1处于正常模式,那么下一个form2应该在正常模式下打开,如果form1处于最大化模式,那么form2应该在最大化模式下打开。当用户导航到上一个表单时,同样的方法也适用。我没有使用MDI Parent - child。
这样做的一种方法如下
frmLogin form = new frmLogin();
form.WindowState = this.WindowState;
form.Show();
this.Hide();但我认为这种方法并不好。在这种情况下,我必须维护以前的表单对新表单的引用,以便当新表单关闭时,以前的表单会占据新表单的windowState
请推荐一个更好的替代方案
发布于 2011-12-29 17:34:22
有一个中心位置(例如,FormStateManager类的对象),用于存储每个表单可用的WindowState信息。您可以使用单例模式在程序中只有一个FormStateManager对象,也可以在每个窗体的构造函数中传递正确的对象。每当表单更改其大小时,都必须通知FormStateManager对象,例如,在WindowState事件中。
发布于 2011-12-29 17:39:05
您可以使用当前的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);
}
}发布于 2011-12-29 17:38:44
在你遵循的方法中看不到任何问题。你有一个FormWindowState类型的变量,它保存了所有表单的最后一个“有效”状态(从你的应用程序的角度来看)。
https://stackoverflow.com/questions/8666032
复制相似问题