Восстановите окно WinForms в правильное положение после Aero Snap - PullRequest
0 голосов
/ 03 марта 2020

Когда я перетаскиваю окно WinForms в верхнюю часть экрана, чтобы выполнить максимизацию «Aero Snap», если после этого я нажимаю кнопку «Восстановить», окно восстанавливается до правильного размера, но в неправильном месте. Он на мгновение мигает в правильное место, но затем сразу же перемещается в верхнюю часть экрана, а его строка заголовка находится на полпути от экрана.

Видимо, окно WinForms восстанавливает свою последнюю перетаскиваемую местоположение до максимизации, которое находилось в верхней части экрана, куда его перетаскивали для выполнения Aero Snap.

Это поведение некорректно и раздражает. Вы можете увидеть правильное поведение, выполнив те же действия для окна Windows Explorer. После Aero Snap окно Windows Explorer корректно восстанавливает до последнего удаленного места восстановления (где бы оно ни находилось до перетаскивания для выполнения Aero Snap).

Как я могу сделать восстановление окна WinForms в правильное местоположение после Aero Snap, как это делает окно Windows Explorer?

Я мог бы попытаться подключиться к событиям позиционирования формы, сохранить последнее выбранное место восстановления и восстановить что после восстановления после Aero Snap, но я надеюсь, что есть более простой способ.

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете переопределить методы OnResizeBegin , OnResizeEnd и OnSizeChanged , чтобы:

  1. сохранять текущее местоположение формы, когда оно впервые при перетаскивании (когда вы начинаете перетаскивать форму вокруг вызываемого OnResizeBegin)
  2. очищать сохраненные значения при освобождении формы (вызывается OnResizeEnd ) пока он WindowState равен FormWindowState.Normal
  3. , наконец, восстановим Form.Location, когда OnSizeChanged уведомит, что Form.WindowState изменится с FormWindowState.Maximized на FormWindowState.Normal.

Если вы используете контроллер или аналогичный, вы можете подписаться на соответствующие события.


Point beginDragLocation = Point.Empty;
FormWindowState beginDragFormState = FormWindowState.Normal;

protected override void OnResizeBegin(EventArgs e) 
{
    base.OnResizeBegin(e);
    beginDragLocation = this.Location;
}

protected override void OnResizeEnd(EventArgs e)
{
    base.OnResizeEnd(e);
    if (this.WindowState != FormWindowState.Maximized) {
        beginDragLocation = Point.Empty;
    }
}

protected override void OnSizeChanged(EventArgs e)
{
    base.OnSizeChanged(e);
    if (beginDragFormState == FormWindowState.Maximized && beginDragLocation != Point.Empty) {
        BeginInvoke(new Action(() => this.Location = beginDragLocation));
    }
    beginDragFormState = this.WindowState;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...