有一个需求,在弹出的页面里,用户没有进行某个操作时,不允许退出弹出页面。项目是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 }
总结: 笔者愚钝,以上实现方法有点恶心。但只有实现功能,总是好的。希望园友能给出更好的解决方案。
作者:Bonker 出处:http://www.cnblogs.com/Bonker QQ:519841366 |
|