我正在寫一個Windows應用程序,基本上在後臺運行與通知圖標與它進行交互。通知圖標可以執行基本的操作,例如退出應用程序或顯示有關它的信息。它也可以啓動一個模態配置對話框。表單打開爲模式對話框關閉按鈕時,即使雖然關閉()不叫
創建對話的代碼是非常簡單的:
using(var frmSettings = new SettingsForm(configuration))
{
frmSettings.ConfigurationChanged += ConfigurationChangedHandler;
frmSettings.UnhandledException += UnhandledExceptionHandler;
frmSettings.ShowDialog();
}
的SettingsForm
類基本上有三個GroupBox
控制,在每一個Label
和TextBox
控制,並在底部4個Button
控制:"Advanced..."
,"Restore Defaults"
,"Cancel"
和"Apply"
。每個TextBox
都有一個Validating
事件處理程序通過設計器連接起來。每個按鈕都有一個Click
處理器通過設計器連接起來。他們每個人都會做很明顯的事情:打開另一個具有更高級設置的模式對話框,將文本框恢復爲默認值,關閉對話框或保存更改,觸發ConfigurationChanged
事件,然後然後關閉對話框所有的字段都是有效的!)。
當出現表單輸入錯誤時,我通過設置((CancelEventArgs)e).Cancel = true
來取消相應的Validating
事件。但是,這兩種形式的默認行爲是爲了防止用戶在驗證失敗時改變焦點。我發現這非常討厭,最終發現在設計選項,當用戶離開現場還自動驗證,而是讓他們離開,即使驗證失敗:AutoValidate = EnableAllowFocusChange
[1]
我"Apply"
按鈕Click
處理器看起來基本上是這樣的:
private void btnApply_Click(object sender, EventArgs e)
{
try
{
if(this.ValidateChildren())
{
this.Configuration.Field1 = this.txtField1.Text;
this.Configuration.Field2 = this.txtField2.Text;
this.Configuration.Field3 = this.txtField3.Text;
if(this.Configuration.Changed)
{
this.Configuration.Save();
this.OnConfigurationChanged(new ConfigurationChangedEventArgs(
this.Configuration));
}
this.Close();
}
}
catch(Exception ex)
{
this.OnUnhandledException(new UnhandledExceptionEventArgs(
"Failed To Apply Configuration Settings",
ex));
}
}
我正在打破第一線並通過線法線步進測試出的代碼。實質上,ValidateChildren
正如預期的那樣返回錯誤,並且整個if
塊,包括this.Close()
都被跳過。然而,如果我一直走到方法的底部,然後走出去,我最終回到frmSettingsForm.ShowDialog()
行,並且表單神奇地關閉。
"Apply"
按鈕被設置爲表格的AcceptButton
。我不知道它是否隱式地將一個處理程序附加到按鈕的事件,以便在按下按鈕時自動關閉窗體。這聽起來不像是邏輯上應該假設的,特別是考慮到似乎沒有辦法取消事件,但這是我能想出的唯一解釋。爲了驗證這一理論,我試圖在設計器中取消設置AcceptButton
,但是當數據無效時,我的表單仍然關閉。
什麼是關閉我的表單,我該如何阻止它?
[1]:如果其他人無法找到它,它是一個表單屬性,而不是每個單獨控件的屬性(正如我預期的那樣)。
重寫'OnClosing'並告訴我們'CloseReason'是什麼。在那裏設置一個斷點,並檢查你的字段的狀態,看看是否有任何線索。 – 2010-10-29 16:29:15
關閉的原因是'沒有'。 : - /我的領域的狀態是預期的(其中兩個文本框是空的,但它們都是必需的)。 – bambams 2010-10-29 16:43:53