2011-09-02 65 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 
}