silverlight 让右上角关闭按钮 无效

有一个需求,在弹出的页面里,用户没有进行某个操作时,不允许退出弹出页面。项目是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
       
本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
原文地址:https://www.cnblogs.com/Bonker/p/2778655.html