.Net: поддерживать форму windowState при переходе к различным формам

В моем приложении пользователь может перейти от одной формы к другой и так далее. Поэтому я хочу поддерживать WindowState каждой формы. Я имею в виду, что если form1 находится в обычном режиме, то следующая форма2 должна быть открыта в обычном режиме, а если форма1 находится в режиме максимизации, то форма2 должна быть открыта в режиме максимизации. Тот же подход применим, когда пользователь переходит на предыдущую форму. Я не использую MDI Parent - child.

Один из способов сделать это заключается в следующем

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

но я думаю, что такой подход не очень хорош. в этом случае я должен сохранить предыдущую ссылку на новую форму, чтобы при закрытии новой формы предыдущая форма занимала новую форму windowState

Пожалуйста, предложите лучшую альтернативу

3 ответа

Решение

Иметь центральное место (например, объект FormStateManager класс), где вы храните информацию WindowState, доступную для каждой из ваших форм. Вы можете использовать любой шаблон синглтона, чтобы иметь только один FormStateManager объект в вашей программе, или передать правильный объект в каждом конструкторе формы. Объект FormStateManager должен быть проинформирован всякий раз, когда одна форма изменяет его WindowStateнапример, в событии Resize.

Вы можете сохранить глобальную переменную (статическую для некоторого класса) с текущей 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);
    }
}

Не вижу никаких проблем в подходе, следуемом вами. У тебя есть FormWindowState введите одну переменную, которая содержит последнее "действительное" (с точки зрения вашего приложения) состояние для всех форм.

Другие вопросы по тегам