C# 当窗口最大化时,获取非最大化窗口位置/大小

C# 当窗口最大化时,获取非最大化窗口位置/大小,c#,forms,winforms,window,maximize,C#,Forms,Winforms,Window,Maximize,当用户调整我的程序窗口(Winforms)的大小和位置时,即使在关闭和重新打开程序后,他们也希望看到处于相同位置的窗口。我要做的是存储窗体的宽度、高度、Location.X和Location.Y属性,并在程序重新打开时将它们设置回原位 问题是当窗口最大化时,宽度、高度、X、Y不是指非最大化的宽度/高度/X/Y,而是指最大化的尺寸 因此,当用户将窗口最大化后,关闭并重新打开程序,然后继续取消窗口最大化,而不是返回到原始位置/大小时,它将保持在完整大小/位置 因此,在某些事件执行后,如果不使用klu

当用户调整我的程序窗口(Winforms)的大小和位置时,即使在关闭和重新打开程序后,他们也希望看到处于相同位置的窗口。我要做的是存储窗体的宽度、高度、Location.X和Location.Y属性,并在程序重新打开时将它们设置回原位

问题是当窗口最大化时,宽度、高度、X、Y不是指非最大化的宽度/高度/X/Y,而是指最大化的尺寸

因此,当用户将窗口最大化后,关闭并重新打开程序,然后继续取消窗口最大化,而不是返回到原始位置/大小时,它将保持在完整大小/位置


因此,在某些事件执行后,如果不使用kludge来存储变量,当窗口最大化时,如何获得非最大化的位置和大小?

解决此问题的最佳方法是使用RestoreBounds结构。当窗口最大化时,RestoreBounds将引用旧的(未最大化的)大小和位置。下面是查找这些值的代码。只需在关闭时保存这些值,然后当程序重新打开时,可以将窗体的宽度、高度、位置.X和位置.Y设置回这些保存的值

bool b = WindowState == FormWindowState.Maximized;
int xpos = !b? Location.X : RestoreBounds.X;
int ypos = !b? Location.Y : RestoreBounds.Y;
int width = !b? Width : RestoreBounds.Width;
int height = !b? Height : RestoreBounds.Height;

你到底为什么要用字符串表示法来比较枚举?只需执行一个简单的
WindowState!=FormWindowsState.Maximized
。根据@cremor的建议,您可以通过测试
WindowsState==FormWindowsState.Maximized
来进一步改进此答案,方法是将其分配给var并测试该布尔值。好的,完成。我搜索了大约15分钟才找到RestoreBounds属性,这是答案的核心,它应用于我创建的旧代码,请原谅,它没有“优化”以节省5毫秒;)