程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WPF Bug清單之(6)——Button的IsCancel屬性失效

WPF Bug清單之(6)——Button的IsCancel屬性失效

編輯:關於.NET

在上一篇中,描述了模態對話框隱藏之後變成了非模態的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。不過是一個平台,不是女友,也不是“知已者”,不需要相守一生。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved