非模式窗體和模式窗體

這是一篇閱讀小結,是關於《Windows Forms 程序設計》中模式與非模式對話框的部分。書乃大師所寫,精妙至極,大師下筆慎重而惜墨,平淡之中蘊含新奇,因而往往點到即止。作爲讀者的我乃凡夫俗子,必定細細揣摩而後得之。本文所寫即是在閱讀了書中的有關段落之後,根據自己試驗所得之體會,爲了便於自己理解,做了必要擴充。雖然只是簡單的窗體調用,但如果能用好其中的某些細節,相信會帶來意想不到的效果。

一、如何調用
  
任何窗體(派生於基類Form的類),都可以以兩種方式進行顯示。

//非模式窗體
From qform=new Form();       
qform.Show();

//模式窗體
Form qform=new Form();
qform.ShowDialog();

二、控制權上的區別
  
Form.Show創建新窗體後(非模式),立即返回,且沒有在當前活動窗體和新窗體間建立任何關係,即在保持新窗口的情況下關閉(或最小化)現有窗體或在保留現有窗體情況下關閉(或最小化)新窗口,都是可以的。
  Form.ShowDialog創建模式窗體,即只有當建立的新窗口關閉之後,原有窗體才能重新獲得控制權。即如果不關閉新窗口,將無法對原活動窗口進行任何操作。對新窗口進行的最小化、還原將會和原窗口一起進行,但是新窗口的關閉對原窗口沒有影響。
  需要注意的是,不管是何種情況,只要主窗體被關閉了,或主程序結束了,那麼Application.Run將會關閉所有窗體,不管它是模式還是非模式。

三、Owner屬性帶來了什麼
  
上面所講的是不建立擁有關係時的窗體。當爲窗體間建立了擁有關係,情況就會有所變化。
  1、首先看非模式的情況。爲非模式新窗口建立擁有關係的方法是修改其Owner屬性。(默認情況下,非模式窗口不存在擁有者)

form.Owner=this;     //假設當前窗口是新窗口的擁有者
form.Show();

  很顯然,新建的非模式窗體已經被認爲是原活動窗體的子窗體,原窗口的行爲將會影響新窗口,所以我們姑且把它們稱作父窗口和子窗口之間的關係。
  那麼,改動後會有什麼顯著的變化呢?主要有兩點:
  第一,父窗口最小化、還原或關閉,子窗口也將隨之最小化、還原或關閉。(注意,在未添加擁有關係之前它們是互不相干的。)反過來,子窗口的最小化、還原或關閉對父窗口不構成影響。
  第二、在任務欄上,只顯示父窗體的圖標而不顯示子窗體的圖標。(在父子關係誕生之前,各窗體在任務欄上有各自圖標。)

2、模式窗體的情況下。用ShowDialog方法顯示新窗體時,當前窗體被認爲是新窗體的邏輯擁有者。所謂邏輯擁有者,是指默認情況下,用ShowDialog而明確指定擁有者的話,Owner值爲null。但無論Owner屬性設置與否,與用戶的交互行爲都是一樣的。
  設置Owner屬性的方法除了同上述Show情況下的那種之外,還有一種,即當作ShowDialog的參數傳遞。如:

form.ShowDialog(this);    //當前窗體爲新窗體的擁有者。

也就是說,如果你指定了第三個窗體爲新模式窗口的Owner,的確,新窗口和原窗口可能斷絕了關係,而是作爲第三個窗口的子窗口的身份出現。但是事實上,它們間的這種父子關係的建立並沒有在行爲上給我們帶來跟多驚喜。比如,新窗口關閉前,父窗口還是不能獲得控制權等等,一切行爲都沒有變。

四、總結與說明
  1、Show方法創建的窗體在行爲上具有不確定性,Owner屬性對此責任重大。
  2、當前活動窗口和用ShowDialog創建的模式窗口之間有着與生俱來的關係,這一關係的承載者是可以改變的,但是這一關係的建立或解除並不能給窗體的行爲帶來任何變化。
  3、一個窗體可以擁有一個可選的擁有者,同時可以成爲多個窗體的擁有者。
  4、這裏所指的子窗體和父窗體並不是真正意義上的,而是爲了加深理解而杜撰出來的不科學的稱法。應與window窗體術語中的父窗體和子窗體區分開,不可混淆。後者存在邊緣裁剪。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章