保存应用程序位置和大小的奇怪行为

时间:2011-09-02 08:43:00

标签: c# .net winforms

我正在使用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

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

嗯,大部分时间它都很完美,但有时候,有时候,应用程序显示的很少。我添加了调试信息,这些是表单返回的值:

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,因为我只使用一台显示器。

这似乎发生在我将应用程序打开了很长时间但不确定的时候。

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

提前致谢

2 个答案:

答案 0 :(得分:3)

您看到的坐标是由于应用程序在关闭时被最小化的事实。 Windows通过实际将其从坐标移动到一些非常大的负X,Y坐标来“隐藏”您的表单。

以编程方式验证。来自Vista上的表单应用程序的输出:

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

来自代码:

System.Diagnostics.Debug.WriteLine(
    "Current coordinates X: " + Location.X + " Y: " + Location.Y );

要解决此问题,我只需在您的应用关闭时检查这样的值,而不是实际将其保存到文件中。如果您不想在任意坐标值上进行数学操作,您还可以检查WindowState。

我在上一篇SO帖子中找到了上述答案: http://msdn.microsoft.com/en-us/library/system.windows.forms.formwindowstate.aspx

答案 1 :(得分: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 
}