有一個需求,在彈出的頁面里,用戶沒有進行某個操作時,不允許退出彈出頁面。項目是silverlight做的。彈出頁面是個silverlight子窗口。vs會自動在頁面右上角有個X按鈕。
先上一段開始寫的屏蔽右上角關閉按鈕的代碼,為頁面添加closing事件。
1 //關閉窗體 2 private void ChildWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 3 { 4 //判斷自己的關閉按鈕是否可用 5 if (btnClose.IsEnabled == true) 6 { 7 //將彈出頁面隱藏 8 this.Visibility = Visibility.Collapsed; 9 } 10 else 11 { 12 //阻止關閉事件 13 e.Cancel = true; 14 } 15 }
以上代碼在winform和wpf里面滿足要求。讓頁面右上角的X關閉按鈕失效。
但在silverlight里面,e.Cancel = true;不能阻止頁面的關閉。
然后翻閱msdn。結論:在silverlight里面微軟為了防止惡意的流氓軟件。做了以下兩個限制。
1,開始運行silverlight程序,不能自動全屏。必須有第三方觸發的事件全屏代碼才有效。
2,彈出層的右上角X按鈕。后台取消關閉事件的代碼無效。即e.Cancel = true無效。
原來如此,這些是在一定程度上貌似阻止了流氓軟件,但卻給Coder們也造成了不小的壓力。 偶然一天,突然想到當silverlight程序在非調試情況下,如果程序出現異常,silverlight不會死掉(微軟的安全機制),而是執行到出現異常代碼的地方停止。不會造成界面的鎖定和死掉。那既然如此,為什么我們不用一個異常來阻止X按鈕的關閉事件呢?
修正后的代碼
1 //關閉窗體 2 private void ChildWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 3 { 4 //判斷自己的關閉按鈕是否可用 5 if (btnClose.IsEnabled == true) 6 { 7 //將彈出頁面隱藏 8 this.Visibility = Visibility.Collapsed; 9 } 10 else 11 { 12 MessageBox.Show("您還有未完成的操作!"); 13 //拋出一個異常,來阻止關閉事件 14 throw new Exception(); 15 } 16 }
總結: 筆者愚鈍,以上實現方法有點惡心。但只有實現功能,總是好的。希望園友能給出更好的解決方案。
