[英]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 后的还原后还原该位置,但我希望有一种更简单的方法。
您可以将OnResizeBegin 、 OnResizeEnd和OnSizeChanged方法覆盖为:
OnResizeBegin
周围拖动表单时)OnResizeEnd
被调用),而它的WindowState
是FormWindowState.Normal
,则清除存储的值OnSizeChanged
通知Form.WindowState
从FormWindowState.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.