我有一个C#应用程序,它在关闭时保存其状态,然后在启动时读取保存状态。保存的一个项目是主窗体的位置。通常这很好 - 在我的代码中有一行这样的行将位置保存到文件中,然后在启动时读回:
streamWriter.WriteLine("location:" + this.Location.X + "," + this.Location.Y);
通常情况下,位置坐标在我的机器上看起来像这样,有多个显示器:
location:-1069,283
偶尔我会看到像这样保存的坐标:
location:-32000,-32000
然后当用户重新启动应用程序时,表单离桌面很远,普通用户无法(轻松)检索。
如何以这种方式读取坐标并且是否有建议来防止这种情况?
答案 0 :(得分:8)
您看到的坐标是由于应用程序在关闭时被最小化的事实。 Windows通过实际将其从坐标移动到一些非常大的负X,Y坐标来“隐藏”您的表单。
以编程方式验证:
Vista上的表单应用输出:
当前坐标X:184 Y:184 *默认位置 当前坐标X: - 32000 Y: - 32000 *最小化位置
来自代码:
System.Diagnostics.Debug.WriteLine(“当前坐标X:”+ Location.X +“Y:”+ Location.Y);
要解决这个问题,我只会在您的应用关闭时检查这样的值,而不是实际将其保存到文件中。
如果您不想在任意坐标值上进行数学操作,您还可以检查WindowState。见here on MSDN
答案 1 :(得分:4)
使用表单上的RestoreBounds属性。
编辑:这是我的一些代码的复制/粘贴(可能会使用一些清理,但它得到了重点)。这是来自我的主窗体的FormClosing事件处理程序:
// Save the last form state
Program.AppSettings.MainWindowFormState = this.WindowState;
// Check if the window is minimized or maximized
if ((this.WindowState == FormWindowState.Minimized) ||
(this.WindowState == FormWindowState.Maximized))
{
// Use the restored state values
Program.AppSettings.MainWindowX = this.RestoreBounds.Left;
Program.AppSettings.MainWindowY = this.RestoreBounds.Top;
Program.AppSettings.MainWindowWidth = this.RestoreBounds.Width;
Program.AppSettings.MainWindowHeight = this.RestoreBounds.Height;
}
else
{
// Use the normal state values
Program.AppSettings.MainWindowX = this.Left;
Program.AppSettings.MainWindowY = this.Top;
Program.AppSettings.MainWindowWidth = this.Width;
Program.AppSettings.MainWindowHeight = this.Height;
}
以下是如何在加载时恢复状态(记得将表单的初始位置模式设置为Manual以避免闪烁):
// Set the initial form state
this.WindowState = Program.AppSettings.MainWindowFormState;
this.Left = Program.AppSettings.MainWindowX;
this.Top = Program.AppSettings.MainWindowY;
this.Width = Program.AppSettings.MainWindowWidth;
this.Height = Program.AppSettings.MainWindowHeight;
答案 2 :(得分:0)
回答主要问题" 正在发生的事情":
我发现在应用程序运行时按下Ctrl + D可轻松复制(=最小化所有窗口并查看桌面的快捷方式)。
当您的窗口被最小化并且您立即设置window.Visible = False
时,您将获得两个坐标(top,left) = -32000
。此尝试不正确,因为窗口已经最小化(=隐藏)并且您正在双重更改坐标。
相反,您应该设置更正确的window.ShowInTaskbar = False
,并且coord -32000的问题会消失。