2

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

一种方法如下

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

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

请提出更好的替代方案

4

3 回答 3

2

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

于 2011-12-29T09:34:21.530 回答
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);
    }
}
于 2011-12-29T09:39:05.383 回答
0

在您所遵循的方法中看不到任何问题。您FormWindowState输入了一个变量,该变量保存所有表单的最后一个“有效”(从您的应用程序的角度来看)状态。

于 2011-12-29T09:38:44.183 回答