C#模態對話框和非模態對話框


模態對話框
彈出窗口阻止調用窗口的所有消息響應。
只有在彈出窗口結束后調用窗口才能繼續。
在模態窗口“關閉”后,可以讀取模態窗口中信息,包括窗口的返回狀態,窗口子控件的值。


非模態對話框
可以在彈出窗口和調用窗口之間隨意切換。
調用窗口調用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)。

原文地址:https://www.cnblogs.com/xiaohua19920/p/9836149.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM