簡體   English   中英

在 Aero Snap 后將 WinForms 窗口恢復到正確位置

[英]Restore WinForms window to correct position after Aero Snap

當我將 WinForms 窗口拖到屏幕頂部以執行最大化“Aero Snap”時,如果我在此之后點擊“恢復”按鈕,窗口將恢復到正確的大小,但在錯誤的位置。 它短暫地閃爍到正確的位置,但隨后它立即移動到屏幕頂部,其標題欄位於屏幕一半的位置。

顯然,WinForms 窗口恢復到它最大化之前的最后一個拖動位置,該位置位於屏幕頂部為了執行 Aero Snap 而被拖動的位置。

這種行為是不正確和煩人的。 您可以通過對 Windows 資源管理器窗口執行相同的步驟來查看正確的行為。 在 Aero Snap 之后,Windows 資源管理器窗口會正確還原到上次放置的還原位置(無論它在被拖動以執行 Aero Snap 之前所處的位置)。

在 Aero Snap 之后,如何讓 WinForms 窗口恢復到正確的位置,就像 Windows 資源管理器窗口一樣?

我可以嘗試掛鈎表單定位事件並保存最后刪除的還原位置,並在 Aero Snap 后的還原后還原該位置,但我希望有一種更簡單的方法。

您可以將OnResizeBeginOnResizeEndOnSizeChanged方法覆蓋為:

  1. 在第一次拖動時存儲表單的當前位置(當您開始在OnResizeBegin周圍拖動表單時)
  2. 如果 Form 被釋放( OnResizeEnd被調用),而它的WindowStateFormWindowState.Normal ,則清除存儲的值
  3. OnSizeChanged通知Form.WindowStateFormWindowState.Maximized更改為Form.Location時,最終恢復FormWindowState.Normal

如果您使用 Controller 或類似的,您可以改為訂閱相應的事件。


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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM