淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別
對(duì)話框不是模式就是無模式的。模式對(duì)話框,在可以繼續(xù)操作應(yīng)用程序的其他部分之前,必須被關(guān)閉(隱藏或卸載)。例如,如果一個(gè)對(duì)話框,在可以切換到其它窗 體或?qū)υ捒蛑耙笙葐螕簟按_定”或“取消”,則它就是模式的。
一、如何調(diào)用
任何窗體(派生于基類Form的類),都可以以兩種方式進(jìn)行顯示。
//非模式窗體
From qform=new Form();
qform.Show();
//模式窗體
Form qform=new Form();
qform.ShowDialog();
一、控制權(quán)上的區(qū)別
Form.Show創(chuàng)建新窗體后(非模式),立即返回,且沒有在當(dāng)前活動(dòng)窗體和新窗體間建立任何關(guān)系,即在保持新窗口的情況下關(guān)閉(或最小化)現(xiàn)有 窗體或在保留現(xiàn)有窗體情況下關(guān)閉(或最小化)新窗口,都是可以的。
Form.ShowDialog創(chuàng)建模式窗體,即只有當(dāng)建立的新窗口關(guān)閉之后,原有窗體才能重新獲得控制權(quán)。即如果不關(guān)閉新窗口,將無法對(duì)原活動(dòng)窗 口進(jìn)行任何操作。對(duì)新窗口進(jìn)行的最小化、還原將會(huì)和原窗口一起進(jìn)行,但是新窗口的關(guān)閉對(duì)原窗口沒有影響。
需要注意的是,不管是何種情況,只要主窗體被關(guān)閉了,或主程序結(jié)束了,那么Application.Run將會(huì)關(guān)閉所有窗體,不管它是模式還是非模 式。
二、Owner屬性帶來了什么
上面所講的是不建立擁有關(guān)系時(shí)的窗體。當(dāng)為窗體間建立了擁有關(guān)系,情況就會(huì)有所變化。
1、首先看非模式的情況。為非模式新窗口建立擁有關(guān)系的方法是修改其Owner屬性。(默認(rèn)情況下,非模式窗口不存在擁有者)
form.Owner=this; //假設(shè)當(dāng)前窗口是新窗口的擁有者
form.Show();
很顯然,新建的非模式窗體已經(jīng)被認(rèn)為是原活動(dòng)窗體的子窗體,原窗口的行為將會(huì)影響新窗口,所以我們姑且把它們稱作父窗口和子窗口之間的關(guān)系。
那么,改動(dòng)后會(huì)有什么顯著的變化呢?主要有兩點(diǎn):
第一,父窗口最小化、還原或關(guān)閉,子窗口也將隨之最小化、還原或關(guān)閉。(注意,在未添加擁有關(guān)系之前它們是互不相干的。)反過來,子窗口的最小化、 還原或關(guān)閉對(duì)父窗口不構(gòu)成影響。
第二、在任務(wù)欄上,只顯示父窗體的圖標(biāo)而不顯示子窗體的圖標(biāo)。(在父子關(guān)系誕生之前,各窗體在任務(wù)欄上有各自圖標(biāo)。)
2、模式窗體的情況下。用ShowDialog方法顯示新窗體時(shí),當(dāng)前窗體被認(rèn)為是新窗體的邏輯擁有者。所謂邏輯擁有者,是指默認(rèn)情況下,用 ShowDialog而明確指定擁有者的話,Owner值為null。但無論Owner屬性設(shè)置與否,與用戶的交互行為都是一樣的。
設(shè)置Owner屬性的方法除了同上述Show情況下的那種之外,還有一種,即當(dāng)作ShowDialog的參數(shù)傳遞。如:
form.ShowDialog(this); //當(dāng)前窗體為新窗體的擁有者。
也就是說,如果你指定了第三個(gè)窗體為新模式窗口的Owner,的確,新窗口和原窗口可能斷絕了關(guān)系,而是作為第三個(gè)窗口的子窗口的身份出現(xiàn)。但是事 實(shí)上,它們間的這種父子關(guān)系的建立并沒有在行為上給我們帶來跟多驚喜。比如,新窗口關(guān)閉前,父窗口還是不能獲得控制權(quán)等等,一切行為都沒有變。
三、總結(jié)與說明
1、Show方法創(chuàng)建的窗體在行為上具有不確定性,Owner屬性對(duì)此責(zé)任重大。
2、當(dāng)前活動(dòng)窗口和用ShowDialog創(chuàng)建的模式窗口之間有著與生俱來的關(guān)系,這一關(guān)系的承載者是可以改變的,但是這一關(guān)系的建立或解除并不能 給窗體的行為帶來任何變化。
3、一個(gè)窗體可以擁有一個(gè)可選的擁有者,同時(shí)可以成為多個(gè)窗體的擁有者。
4、這里所指的子窗體和父窗體并不是真正意義上的,而是為了加深理解而杜撰出來的不科學(xué)的稱法。應(yīng)與window窗體術(shù)語中的父窗體和子窗體區(qū)分 開,不可混淆。后者存在邊緣裁剪。
以上這篇淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:C#實(shí)現(xiàn)啟用與禁用本地網(wǎng)絡(luò)的方式小結(jié)【3種方式】
欄 目:C#教程
下一篇:C#實(shí)現(xiàn)同Active MQ通訊的方法
本文標(biāo)題:淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6354.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#實(shí)現(xiàn)簡(jiǎn)單過濾非法字符實(shí)例
- 01-10詳解C# 托管資源和非托管資源
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例
- 01-10淺談C#中簡(jiǎn)單的異常引發(fā)與處理操作
- 01-10淺談C#指針問題
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?