2011-09-02 69 views
0

我正在使用Windows窗体(C#)。我在我的窗口位置和大小保存到磁盘中Closing事件我的形式,使用以下属性:保存应用程序位置和大小的奇怪行为

(int) Width, Height -> using the Form.Size property 
(int) LocationX, LocationY -> using the Form.Location property 
(bool) Maximized -> using the Form.WindowState property 

形式是应用程序的主要形式。当应用程序加载时,我将这些属性设置为表单。这很简单。

那么,大多数时候它的工作是完美的,但有时,只是有时候,应用程序显示非常少。我已经加入调试信息,这些都是形式返回的值:

2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Width -> 160 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Height -> 27 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - LocationX -> -32000 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - LocationY -> -32000 
2011-09-01 20:02:44,334 DEBUG 9884 MainFormSettings - Maximized -> False 

我敢肯定,我的窗口是大小(160,27)的不和也位置不-32000,因为我用只有一台显示器。

这似乎发生在我打开应用程序很长一段时间但未知的情况下。

  • 你知道为什么有时候为了有这些奇怪的价值吗?
  • 可能会影响在关闭事件中存储此事(我也尝试在关闭事件中执行此操作)并获得相同结果?

在此先感谢

+0

在该形式的事件正在装载您要申请这些保存设置后?显示或加载? – Zenwalker

+0

此外,您应该使用FormClosing事件,因为从2.0开始不推荐使用Closing事件。 – TrymBeast

+1

您需要重写OnResize()并将WindowState与存储在变量中的最后一个已知对象进行比较。除非窗口状态为“正常”,否则不要存储大小。 –

回答

3

你看到的坐标是由于这样的事实,当它被关闭的应用程序最小化。 Windows通过将它从坐标移动到一些可笑的大负X,Y坐标来“隐藏”你的窗体。

验证程序:从Vista的形式应用

输出:

当前坐标X:184 Y:184 *默认位置当前坐标X:-32000 Y:-32000 *最小化位置

来自代码:

System.Diagnostics.Debug.WriteLine(“当前坐标X:”+ Location.X +“Y:”+ Location.Y);

为了解决这个问题,我只是简单地检查一下你的应用程序关闭时的值,而不是将它保存到文件中。

如果你不想在任意坐标值上搞数学,你也可以检查WindowState。

我在上面的SO帖子中发现了上面的答案。

http://msdn.microsoft.com/en-us/library/system.windows.forms.formwindowstate.aspx

+0

请将此链接粘贴到以前的SO帖子中吗? –

+0

http://stackoverflow.com/questions/ 1478765 /位置坐标上的计算机-表示-X-32000-Y-32000 – MStp

2

您可以使用窗体上的RestoreBounds财产被最小化的形式时,得到窗口的大小+位置。

例如:

private void Form_Closing(object sender, FormClosingEventArgs e) 
{ 
     Location locationToSave = this.WindowState == FormWindowState.Minimized ? this.RestoreBounds.Location : this.Location; 
     Size sizeToSave = this.WindowState == FormWindowState.Minimized ? this.RestoreBounds.Size : this.Size; 
     WindowState windowStateToSave = this.WindowState; 

     // ... save your state 
}