"Dialogs must be user-initiated."与Silverlight 3中的SaveFileDialog。
"Dialogs must be user-initiated."与Silverlight 3中的SaveFileDialog。
我正在使用C#开发Silverlight 3应用程序。我希望允许用户从Silverlight应用程序中下载图像。我使用SaveFileDialog执行文件下载任务。流程如下:
- 用户在SL应用程序中点击下载按钮。
- 调用Web服务以从服务器获取图像。
- 在Web方法调用的OnCompleted异步事件处理程序中调用并接收来自服务器的二进制图像。
- 在OnCompleted事件处理程序中,提示用户使用SaveFileDialog将图像保存到计算机。
- 将图像流式传输到用户硬盘上的文件。
我在一个函数中使用以下代码来完成SaveFileDialog的提示,然后将图像流式传输到文件中,该函数从OnCompleted事件处理程序中调用。
SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "JPG Files|*.jpg" + "|All Files|*.*"; bool? dialogResult = dialog.ShowDialog(); if (dialogResult == true) { using (Stream fs = (Stream)dialog.OpenFile()) { fs.Write(e.Result, 0, e.Result.Length); fs.Close(); } }
在上述代码中调用ShowDialog方法时,SaveFileDialog会抛出“对话框必须由用户发起”的错误。我可能漏掉了什么?如何解决这个问题?
这个错误消息的意思是,你只能在用户发起的事件(比如按钮点击)的响应中显示SaveFileDialog。在你描述的例子中,你并不是在点击事件的响应中显示SaveFileDialog,而是在完成的http请求的响应中显示(这不被认为是用户发起的事件)。所以,为了让这个工作起来,你需要在http请求的Completed事件中向用户显示一些UI,告诉他们“下载完成,请点击这里将文件保存到您的计算机”,当用户点击这个消息时,显示SaveFileDialog。
我在使用SaveFileDialog时也遇到了相同的错误消息,因为我在调用new SaveFileDialog()之前在方法中进行了一些验证。下面的链接显示了一个很好的例子,但关键似乎是在按钮事件处理程序中将new SaveFileDialog()作为第一行。之后,你似乎可以做任何你喜欢的事情。
而且,“第一”行真的意味着第一行。我正在调试别人的代码,一个在按钮点击事件处理程序中的注释代码块导致了上述异常。
我认为这更像是保存对话框打开之前的时间问题。如果你在dialog.ShowDialog()之前设置一个断点,就会出现错误。详见dotnetslang.wordpress.com/2011/03/12/…
问题原因:这个问题是由于Silverlight 3中的SaveFileDialog对话框必须由用户发起才能打开,不能在代码中直接调用。
解决方法:可以在按钮事件处理程序中创建SaveFileDialog对话框,关键是要确保构造函数是方法的第一行。
正如Keith所提到的,这是设计上的要求。这个教程提供了一个很好的示例,使用代码从服务器下载文件的“正确”方法(在Silverlight 4中也适用)。
你也可以在按钮事件处理程序中创建SaveFileDialog对话框。关键是要确保构造函数是方法的第一行。
问题:在Silverlight 3中使用SaveFileDialog时,为什么会出现"Dialogs must be user-initiated."错误,并且如何解决这个问题?
出现原因:Silverlight要求对话框必须由用户发起,而不是通过弹出窗口方式进行。
解决方法:在下载之前先询问用户是否同意。这样做不仅可以遵守Silverlight的安全模型,还可以避免在下载完成之前等待询问保存位置的操作。
文章内容如下:
在使用Silverlight 3时,如果在使用SaveFileDialog时出现"Dialogs must be user-initiated."错误,这是由于Silverlight要求对话框必须由用户发起,而不是通过弹出窗口方式进行。
有人建议,在下载之前先询问用户是否同意下载。这样做既可以遵守Silverlight的安全模型,还可以避免在下载完成之前等待询问保存位置的操作。
在Silverlight中,为了保证用户请求了该操作,而不是开发者滥用弹出窗口的方式,需要先询问用户是否同意下载。这种方式可以避免开发者向用户发送弹出窗口的问题。
对于有关Silverlight 3中使用SaveFileDialog的问题,解决方法是在下载之前先询问用户是否同意下载。这不仅满足了Silverlight的要求,还可以提高用户体验,避免用户在下载完成之前等待询问保存位置的操作。
示例代码如下:
SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Text Files|*.txt"; dialog.ShowDialog();
以上就是关于在Silverlight 3中使用SaveFileDialog时出现"Dialogs must be user-initiated."错误的原因和解决方法。通过询问用户是否同意下载,可以遵守Silverlight的安全模型,并提供更好的用户体验。