.Net: поддерживать форму windowState при переходе к различным формам - PullRequest
2 голосов
/ 29 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

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

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

0 голосов
/ 29 декабря 2011

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

...