淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別
對話框不是模式就是無模式的。模式對話框,在可以繼續(xù)操作應用程序的其他部分之前,必須被關閉(隱藏或卸載)。例如,如果一個對話框,在可以切換到其它窗 體或對話框之前要求先單擊“確定”或“取消”,則它就是模式的。
一、如何調用
任何窗體(派生于基類Form的類),都可以以兩種方式進行顯示。
//非模式窗體
From qform=new Form();
qform.Show();
//模式窗體
Form qform=new Form();
qform.ShowDialog();
一、控制權上的區(qū)別
Form.Show創(chuàng)建新窗體后(非模式),立即返回,且沒有在當前活動窗體和新窗體間建立任何關系,即在保持新窗口的情況下關閉(或最小化)現(xiàn)有 窗體或在保留現(xiàn)有窗體情況下關閉(或最小化)新窗口,都是可以的。
Form.ShowDialog創(chuàng)建模式窗體,即只有當建立的新窗口關閉之后,原有窗體才能重新獲得控制權。即如果不關閉新窗口,將無法對原活動窗 口進行任何操作。對新窗口進行的最小化、還原將會和原窗口一起進行,但是新窗口的關閉對原窗口沒有影響。
需要注意的是,不管是何種情況,只要主窗體被關閉了,或主程序結束了,那么Application.Run將會關閉所有窗體,不管它是模式還是非模 式。
二、Owner屬性帶來了什么
上面所講的是不建立擁有關系時的窗體。當為窗體間建立了擁有關系,情況就會有所變化。
1、首先看非模式的情況。為非模式新窗口建立擁有關系的方法是修改其Owner屬性。(默認情況下,非模式窗口不存在擁有者)
form.Owner=this; //假設當前窗口是新窗口的擁有者
form.Show();
很顯然,新建的非模式窗體已經被認為是原活動窗體的子窗體,原窗口的行為將會影響新窗口,所以我們姑且把它們稱作父窗口和子窗口之間的關系。
那么,改動后會有什么顯著的變化呢?主要有兩點:
第一,父窗口最小化、還原或關閉,子窗口也將隨之最小化、還原或關閉。(注意,在未添加擁有關系之前它們是互不相干的。)反過來,子窗口的最小化、 還原或關閉對父窗口不構成影響。
第二、在任務欄上,只顯示父窗體的圖標而不顯示子窗體的圖標。(在父子關系誕生之前,各窗體在任務欄上有各自圖標。)
2、模式窗體的情況下。用ShowDialog方法顯示新窗體時,當前窗體被認為是新窗體的邏輯擁有者。所謂邏輯擁有者,是指默認情況下,用 ShowDialog而明確指定擁有者的話,Owner值為null。但無論Owner屬性設置與否,與用戶的交互行為都是一樣的。
設置Owner屬性的方法除了同上述Show情況下的那種之外,還有一種,即當作ShowDialog的參數傳遞。如:
form.ShowDialog(this); //當前窗體為新窗體的擁有者。
也就是說,如果你指定了第三個窗體為新模式窗口的Owner,的確,新窗口和原窗口可能斷絕了關系,而是作為第三個窗口的子窗口的身份出現(xiàn)。但是事 實上,它們間的這種父子關系的建立并沒有在行為上給我們帶來跟多驚喜。比如,新窗口關閉前,父窗口還是不能獲得控制權等等,一切行為都沒有變。
三、總結與說明
1、Show方法創(chuàng)建的窗體在行為上具有不確定性,Owner屬性對此責任重大。
2、當前活動窗口和用ShowDialog創(chuàng)建的模式窗口之間有著與生俱來的關系,這一關系的承載者是可以改變的,但是這一關系的建立或解除并不能 給窗體的行為帶來任何變化。
3、一個窗體可以擁有一個可選的擁有者,同時可以成為多個窗體的擁有者。
4、這里所指的子窗體和父窗體并不是真正意義上的,而是為了加深理解而杜撰出來的不科學的稱法。應與window窗體術語中的父窗體和子窗體區(qū)分 開,不可混淆。后者存在邊緣裁剪。
以上這篇淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步
這篇文章主要為大家詳細介紹了C#如何使用屏障實現(xiàn)多線程并發(fā)操作保持同步,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-01-01
DevExpress實現(xiàn)GridControl同步列頭checkbox與列中checkbox狀態(tài)
這篇文章主要介紹了DevExpress實現(xiàn)GridControl同步列頭checkbox與列中checkbox狀態(tài),需要的朋友可以參考下2014-08-08
C#12中的Collection expressions集合表達式語法糖詳解
C#12中引入了新的語法糖來創(chuàng)建常見的集合,并且可以使用..來解構集合,將其內聯(lián)到另一個集合中,下面就跟隨小編一起學習一下C#12中這些語法糖的使用吧2023-11-11
C#中讓控件全屏顯示的實現(xiàn)代碼(WinForm)
有時候需要讓窗口中某一塊的內容全屏顯示,比如視頻播放、地圖等等。經過摸索,暫時發(fā)現(xiàn)兩種可行方法,如果有誰知道其他方法,敬請告知2012-04-04

