2

私のアプリケーションでは、ユーザーはあるフォームから別のフォームに移動できます。したがって、各フォームのWindowStateを維持したいと思います。つまり、form1が通常モードの場合は次のform2を通常モードで開き、form1が最大化モードの場合はform2を最大化モードで開く必要があります。ユーザーが前のフォームに移動するときにも同じアプローチが適用されます。私はMDIの親-子を使用していません。

これを行う1つの方法は、次のとおりです。

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

しかし、このアプローチは良くないと思います。この場合、新しいフォームへの以前のフォーム参照を維持する必要があるため、新しいフォームが閉じると、前のフォームが新しいフォームwindowStateを占有します。

より良い代替案を提案してください

4

3 に答える 3

2

FormStateManagerすべてのフォームで使用できる WindowState 情報を格納する中心的な場所 (たとえば、クラスのオブジェクト) を用意します。FormStateManagerプログラムでオブジェクトを1 つだけ持つシングルトン パターンを使用するか、すべてのフォームのコンストラクターで適切なオブジェクトを渡すことができます。FormStateManager オブジェクトは、1 つのフォームが変更されるたび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すべてのフォームの最後の「有効な」(アプリの観点から) 状態を保持するタイプ 1 変数があります。

于 2011-12-29T09:38:44.183 に答える