Восстановить окно WinForms в правильное положение после Aero Snap

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

По-видимому, окно WinForms восстанавливается до своего последнего перетаскиваемого места до того, как оно было развернуто, то есть в верхней части экрана, куда оно было перетащено для выполнения Aero Snap.

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

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

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

1 ответ

Вы можете переопределить методы 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;
}
Другие вопросы по тегам