silverlight问题解决: 对话框必须由用户启动 SecurityException: Dialogs must be user-initiated

转自:http://www.dotblogs.com.tw/junegoat/archive/2010/10/07/securityexception-dialogs-must-be-user-initiated.aspx

[Silverlight] SaveFileDialog 会发生的小问题 - SecurityException: Dialogs must be user-initiated

这是一个很简单的范例…

可以把TextBox 里面的文字给写入到本端的档案…
但是会出现 "SecurityException: Dialogs must be user-initiated " ( 对话框必须要被使用者启动)
而且是偶尔会出现…

先介绍一下案例:

在txtContext中输入文字..然後按下 btnSave 可以存档…

 

XAML Code:

<UserControl x:Class="SaveFileDialogMemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
 
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox Height="192" HorizontalAlignment="Left" Margin="12,20,0,0" Name="txtContext" VerticalAlignment="Top" Width="368" FontSize="14" AcceptsReturn="True" TextWrapping="Wrap" Text="如果等等的彈出視窗,你快速把他按掉有機會可以存檔成功" />
        <Button Content="存檔" Height="32" HorizontalAlignment="Left" Margin="296,218,0,0" Name="btnSave" VerticalAlignment="Top" Width="84" FontSize="14" Click="btnSave_Click" />
    </Grid>
</UserControl>

 

接下来我们来看看 btnSave 中的C# Code :
private void btnSave_Click(object sender, RoutedEventArgs e)
{
            try{
            SaveFileDialog sfd=new SaveFileDialog();
            sfd.DefaultExt = ".txt";
            sfd.Filter = "Text Files|*.txt|Log Files|*.log|All Files|*.*";
            //把下一行注解掉一切就会正常
            MessageBox.Show("稍微停一下按掉就会错,如果按得快一点就不会错!!");

            if (sfd.ShowDialog() == true)
            {

                using (Stream stream = sfd.OpenFile())
                {
                    using (StreamWriter writer = new StreamWriter(stream, System.Text.UnicodeEncoding.Unicode))
                    {
                        writer.Write(this.txtContext.Text);
                        writer.Close();
                    }
                    stream.Close();
                }
            }
                }
            catch(Exception ex)
            {
                MessageBox.Show(ex.StackTrace);
            }
}

其中点击bntSave 的时候…
我会在  sfd.ShowDialog()   之前 叫出一个  MessageBox.Show("稍微停一下按掉就会错,如果按得快一点就不会错!!");
如果您稍微等一下…再按掉…Exception 就会出现了..如果你按得快一点就不会…
为了de这bug花了我一点时间..因为有时候会错有时候不会错….
查了msdn 提到一句话
    The ShowDialog method can only be called from user-initiated code, such as a button Click event. If ShowDialog is called from code that is not user-initiated, such as a PageLoaded event, a SecurityException is thrown. In addition, there is a limit on the time allowed between when the user initiates the dialog and when the dialog is shown. If the time limit between these actions is exceeded, an exception will occur.
我简单翻译一下:

该 ShowDialog的只能被此用者给呼叫启动,像是一个按钮 Click 事件。 如果ShowDialog不是被使用者给呼叫的,如 PageLoaded 事件,会造成一个 SecurityException的 异常。此外,有一个允许的时间限制当用户启动之间的对话,当对话框显示。 如果这行为之间的时间限制超标,就会发生异常。

很帅气吧…这种偶尔会对偶尔不对的bug超难找…

所以学到一个经验…当你要调用SaveFileDialog.ShowDialog() 时候,记得前面保持干净(应该是把


SaveFileDialog.ShowDialog()放在调用代码的最前面),不要有其他跟使用者的互动行为…有时间限制的…


 范例源码:

https://skydrive.live.com/self.aspx/blogsource/SaveFileDialogMemo.rar?cid=19ad32092ea01e0d&sc=documents 

 

 
 

 

 
 

 

 

 

 

 

时间: 2024-10-28 09:31:22

silverlight问题解决: 对话框必须由用户启动 SecurityException: Dialogs must be user-initiated的相关文章

以普通用户启动的Vim如何保存需要root权限的文件

在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误: E45: 'readonly' option is set (add ! to override) 这表明文件是只读的,按照提示,加上!强制保存::w!,结果又一个错误出现: "readonly-file-name" E212: Can't open file for writing 文件明明存在,为何提示无法打开?这错误又代表什么呢?查看文档:help E212:

如何给基于对话框的应用加启动画面

很多基于对话框的程序都有一个启动画面,那么如何为自己的对话框程序也加一个这样的画面呢?本文将一步一步教你实现每一个细节.其实VC++开发环境中有一个现成的 Splash Screen 组件,用这个组件很容易实现基于框架类(也就是CMainFrame)的程序的启动画面,那么如果是对话框程序,没有框架类怎么办呢?所以这个组件功能不是想象的那么强.要实现基于对话框应用程序的启动画面必须另辟蹊径.本文将定制一个C++类:CSplashWnd,用这个类可以增强原来的 Splash Screen 组件功能.

用oracle用户启动listener的时候报错

Oracle 10g + Redhat5,安装使用一切正常,安装用户oracle. 今天用oracle用户启动sqlplus正常 [abc@rhel4 admin]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Thu Apr 23 12:11:25 2009 Copyright (c) 1982, 2005, Oracle.  All rights reserved. Connected to: Oracle

mysql-Linux安装MySQL 使用普通用户启动问题

问题描述 Linux安装MySQL 使用普通用户启动问题 在Centos上安装下MySQL数据,新建了一个mysql用户,想让mysql用户来管理MySQL数据库. 启动MySQL后,发现有连个进程为什么我装的MySQL启动两个服务,还有mysqld_safe是root启动的, mysqld是mysql用户启动,有谁知道怎么回事![图片说明](http://img.ask.csdn.net/upload/201501/27/1422353422_520893.png) 解决方案 mysqld_s

微软将对中国用户启动Surface 2和Surface Pro 2预订活动

摘要: 10月8日消息微软将于今日中午12时对中国用户启动Surface 2和Surface Pro 2的预订活动.其中,Surface 2的32GB版本售价定为3288元.用户可以通过微软中国官方商城.天猫商城的微软中国官方旗 10月8日消息微软将于今日中午12时对中国用户启动Surface 2和Surface Pro 2的预订活动.其中,Surface 2的32GB版本售价定为3288元.用户可以通过微软中国官方商城.天猫商城的微软中国官方旗舰店.国美电器.宏图三胞.京东商城.美承.顺电.苏

Silverlight程序集缓存巧妙设置 优化用户体验

Silverlight中的程序集缓存可以将一些独立的程序集放在XAP包外边并可以缓存在客户端的浏览器中,这样就可以减少程序启动时下载XAP包的时间.默认情况下Silverlight并没有开启程序集缓存,因此需要自己动手开启. 右键打开项目的属性,并在通过使用应用程库缓存较小XAP大小选项打钩,如图: 在没选择此项之前编译项目看一下XAP中的DLL,如图: 重新编译项目,选择显示所有文件然后打开Bin\Debug目录,会看到每一个缓存程序集都有自己的zip文件包.比如,如果使用了System.Wi

一起谈.NET技术,Silverlight程序集缓存巧妙设置 优化用户体验

Silverlight中的程序集缓存可以将一些独立的程序集放在XAP包外边并可以缓存在客户端的浏览器中,这样就可以减少程序启动时下载XAP包的时间.默认情况下Silverlight并没有开启程序集缓存,因此需要自己动手开启. 右键打开项目的属性,并在通过使用应用程库缓存较小XAP大小选项打钩,如图: 在没选择此项之前编译项目看一下XAP中的DLL,如图: 重新编译项目,选择显示所有文件然后打开Bin\Debug目录,会看到每一个缓存程序集都有自己的zip文件包.比如,如果使用了System.Wi

B/S 在线系统需要更新的时候弹出对话框提醒在线用户

问题描述 如题所示 请教大家如何用java实现这个应用, 对话框类似js alert() . DB: mysql server:tomcat 7.0 问题补充:sandzhang 写道 解决方案 首先如果你是bs系统,服务端是没办法主动给你发东西的,只能浏览器不停的调用js去请求假如你是cs的才有可能象qq那样处理也有http长连接,不过不是很推荐这种解决方案二:最简单的方式就是在数据库中记录一条需要更新的记录,js通过ajax的方式来获取,获取以后更新该记录的标识为已通知或者是其他能区分开就好

微软将对中国用户启动Surface 2和Surface Pro 2的预订活动

其中,Surface 2的32GB版本售价定为3288元.用户可以通过微软中国官方商城.天猫商城的微软中国官方旗舰店.国美电器.宏图三胞.京东商城.美承.顺电.苏宁.易迅网等线上.线下零售渠道预订Surface 2和Surface Pro 2. Surface 2和Surface Pro 2相比第一代进行了一系列升级,例如提升的处理能力和更长的电池续航时间.改善的显示器和更好的摄像头分辨率,还有更加灵活的双角度集成支架.此外,Windows RT8.1和Windows 8.1专业版中的升级功能也