在上一篇中,描述了模態對話框隱藏之後變成了非模態的Bug,很多人回復表示這不算是一個Bug,我也表示理解。Bug只有在需求之下才有意義,不同的需求,對Bug的界定也不一樣。作為一個Framework,.NET只能做到在多數時候是符合最廣泛群體的需求的,就可以說它合格。但是對於前一篇描述的問題,想補充一下自己的考慮。
Window的Show和ShowDialog,用於將窗體展現(我沒有用顯示)出來,而Close用於關閉。Close之後就不能再用Show或是ShowDialog再次將窗體展現出來,否則會拋出異常,所以5樓的gboxcc回復的是錯的。很同情這位gboxcc,因為他認為我說錯的那句,恰恰是我寫過代碼驗證過的。
如果想隱藏而不關閉一個窗體,顯然用Close是不行的。而且還要把所有的Close事件Cancel掉,保證窗體不會被Close,然後只能用Visibility 將窗體隱藏起來。隱藏之後,如果要將窗體再次顯示出來,我的第一感覺是用Visibility,但是發現不行。
從這個角度而言,Window類,Show/Close只在開始和結束的時候調用,因為它們不能交替調用;在窗體Show之後,用Visibility控制其可見性,因為可見性可以隨意交替設置的。我認為這才是一個非常自然的事情。但是Window的實際情況是,Visibility的設置,會使isShowingDialog變量的值發生變化,單從需求上講,這是不應該的。所以將其做為一個Bug提了出來。Colin Han認為這是“為了更好地用戶體驗,專門做出的設計。”,我亦不以為然。而且我感覺微軟的UX團隊與開發團隊的溝通還很不充分,比如我在另一篇文章中提到的WPF的Window,沒有提供一個屬性來設置一個窗體是否顯示Icon,這本身就不符合微軟自己的UX Guide。
回復的人一致認為,再次顯示這個窗體時也應該用ShowDialog。好,這篇文章就是為次而生的。因為用ShowDialog將窗體再次顯示出來同樣有問題。連代碼都不用改,直接用上次的代碼就可以重現這個問題。使用ShowDialog方法將一個窗體再次顯示出來之後,窗體上的”Hide Self”按鈕失效了。注意是再次,第一次ShowDialog出來時的行為是正常的。
這裡順便介紹一下IsCancel屬性,MSDN上對它的解釋如下:獲取或設置一個,該值指示Button是否是一個“取消”按鈕。用戶可以通過按ESC鍵激活“取消”按鈕。其實我感覺這句話對於新手而言實在是沒有什麼幫助。好像就告訴別人這個屬性就是給Button加了個ESC鍵作為快捷鍵。必須要和MSDN上的很多文檔合起來看才知道這個IsCancel按鈕在不同環境下分別起什麼作用,其實還不如自己寫個代碼試一下來得方便。
對於示例中的代碼而言,IsCancel就相當於讓當前窗體關閉。這是給窗體添加一個關閉按鈕最簡單的方式(沒有之一)。因為這個Bug用的就是上一篇的代碼。所以就不給大家貼圖了。自己運行一下吧。邏輯如下:
1.點擊示例中的Show Model Dialog按鈕——顯示一個模態對話框。
2.可以用Hide Self關閉彈出框。
3.再用Show Model Dialog彈出這個對話框。
4.那個Hide Self按鈕不再起作用了。
我是MS Fan,但是我依然會以挑剔的眼光看它;只因為我是MS Fan的原因是,從多數開發和娛樂和應用的角度而言,MS是目前最好的選擇。如果有一天Linux的哪個發行版在多數方面超過了MS,我會義無反顧地投入Linux。不過是一個平台,不是女友,也不是“知已者”,不需要相守一生。