模態對話框
彈出窗口阻止調用窗口的所有消息響應。
只有在彈出窗口結束后調用窗口才能繼續。
在模態窗口“關閉”后,可以讀取模態窗口中信息,包括窗口的返回狀態,窗口子控件的值。
非模態對話框
可以在彈出窗口和調用窗口之間隨意切換。
調用窗口調用show方法后,下面的代碼可以立即執行。在非模態窗口關閉后,窗口的所有資源被釋放,窗口不存在,無法獲取窗口的任何信息。
所謂模態對話框,就是指除非采取有效的關閉手段,用戶的鼠標焦點或者輸入光標將一直停留在其上的對話框。非模態對話框則不會強制此種特性,用戶可以在當前對話框以及其他窗口間進行切換
概念說明
1 模態窗口
打開模態窗口后,只要不關閉該窗口,鼠標焦點或者光標就會一直停留在該窗口上。只有關閉該窗口后,調用窗口才能繼續。模態窗口關閉后,仍可以讀取模態窗口中的信息,如窗口的返回狀態等。
2 非模態窗口
打開非模態窗口后,仍可以操作調用窗口。關閉非模態窗口,該窗口將不復存在,會釋放窗口的所有資源,所以無法得到該窗口的任何信息。
實例說明
1 建立Windows窗體程序ShowAndShowDialogExp,程序主畫面包含兩個按鈕,用於打開模態窗口和非模態窗口(如下圖所示)。
2 編寫按鈕的Click事件代碼
private void button1_Click(object sender, EventArgs e) { Form frm1 = new Form(); frm1.Text = "我是模態窗口!"; frm1.ShowDialog();//打開模態窗口(對話框) } private void button2_Click(object sender, EventArgs e) { Form frm2 = new Form(); frm2.Text = "我是非模態窗口!"; frm2.Show();//打開非模態窗口(對話框) }
3 運行代碼,進行操作體驗
點擊按鈕“打開模態窗口”,打開模態窗口frm1,窗口標題欄顯示“我是模態窗口!”,此時無法切換到調用窗口,當關閉該窗口后,又可以繼續操作調用窗口了。
點擊按鈕“打開非模態窗口”,打開非模態窗口frm2,此時,可以仍切換到調用窗口操作調用窗口。
4 實例結論
C#中使用Show()方法打開非模態窗口,使用ShowDialog()方法打開模態窗口。
5 進階
修改前面按鈕的Click事件代碼,修改后的代碼如下所示。
private void button1_Click(object sender, EventArgs e) { Form frm1 = new Form(); frm1.Text = "我是模態窗口!"; frm1.ShowDialog();//打開模態窗口(輟對話框) MessageBox.Show(frm1.DialogResult.ToString()); } private void button2_Click(object sender, EventArgs e) { Form frm2 = new Form(); frm2.Text = "我是非模態窗口!"; frm2.Show();//打開非模態窗口(對話框) MessageBox.Show(frm2.DialogResult.ToString()); }
朋友,發現跟前面代碼的區別了嗎?
呵呵,僅僅加了一句輸出彈出窗口的DialogResult屬性值的代碼而已。
再次執行代碼,程序的運行情況是:
點擊“打開模態窗口”打開模態窗口,接着關閉模態窗口,會彈出消息框,輸出“Cancel”(frm1.DialogResult.ToString()的結果)。
點擊“打開非模態窗口”打開非模態窗口后,便會彈出消息框,輸出“None”(frm2.DialogResult.ToString()的結果)。
從程序執行情況我們了解到:
執行Show()方法后,后面的代碼會立即執行;而執行ShowDialog()方法后,后面的代碼需要等彈出窗口關閉后才能及時執行。
前面說到:模態窗口關閉后,仍可以讀取模態窗口中的信息。
這主要是因為:當“關閉”模態窗口后,窗體並沒有被真的被“關閉”,因為用戶點擊“關閉”按鈕或者設置DialogResult屬性值時,並沒有調用窗體的Close方法,只是將窗體的Visible屬性賦值為false,隱藏了窗體而已。這樣隱藏的窗體是可以被重新顯示的,且窗體資源並沒有被釋放。所以,在你真的不需要這個窗體時,一定要記得Dispose一下哦。
為了說明這一切,修改前面打開模態窗口的按鈕Click事件代碼。
private void button1_Click(object sender, EventArgs e) { Form frm1 = new Form(); frm1.Text = "我是模態窗口!"; frm1.ShowDialog();//打開模態窗口(對話框) MessageBox.Show(frm1.DialogResult.ToString()); frm1.Visible = true; }
代碼執行情況是:
打開模態窗口后,關閉窗口,窗口隱藏,同時,彈出消息框,顯示“Cancel”,接着,關閉消息框,模態窗口又被顯示(frm1.Visible = true)。