"对话必须是用户启动的." 使用Silverlight 3中的SaveFileDialog

pen*_*ate 18 .net c# silverlight-3.0

我正在使用C#开发Silverlight 3应用程序.我想允许用户从Silverlight应用程序下载图像.我正在使用SaveFileDialog来执行文件下载任务.流程就是这样:

  1. 用户单击SL应用程序中的"下载"按钮.
  2. 调用Web服务调用以从服务器获取映像
  3. 调用Web方法调用的OnCompleted异步事件处理程序并从服务器接收二进制映像
  4. 在OnCompleted事件处理程序中,SaveFileDialog提示用户将图像保存到计算机.
  5. 将图像流式传输到用户硬盘上的文件.

我在一个函数中使用以下代码,该函数从OnCompleted事件处理程序调用,以完成SaveFileDialog提示,然后流式传输到文件.

            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();
                }
            }
Run Code Online (Sandbox Code Playgroud)

SaveFileDialog会抛出错误"对话必须是用户启动的".在上面的代码中调用ShowDialog方法时.我在这里可以缺少什么?怎么克服这个?

Kei*_*ney 20

此错误消息的含义是您只能显示SaveFileDialog以响应用户启动的事件,例如单击按钮.在您描述的示例中,您没有显示SaveFileDialog以响应单击,而是响应已完成的http请求(不被视为用户启动的事件).因此,要使其工作,您需要做的是,在http请求的Completed事件中,向用户显示一些UI,说"下载已完成,单击此处将文件保存到您的计算机",以及当用户点击时在此消息上,显示SaveFileDialog.

  • 我尝试直接从Button_Click事件处理程序使用SaveFileDialog时收到相同的错误消息,因为我在调用new SaveFileDialog()之前在方法中进行了一些验证.下面的JumpingJezza链接显示了一个很好的示例,但似乎关键是在按钮事件处理程序中将新的SaveFileDialog()作为*first*行.在那之后,你似乎可以做任何你喜欢的事情. (8认同)
  • 我认为这是在saveialog开放之前的时间问题.如果在dialog.ShowDialog()错误发生之前放置断点.见http://dotnetslang.wordpress.com/2011/03/12/using-the-savefiledialog-dialogs-must-be-user-initiated-exception/ (3认同)

Ray*_*yes 5

在下载之前先问一下怎么样?它似乎从错误消息中建议,这是Silverlight希望您提示确保它知道用户请求操作的方式,而不是您使用弹出窗口对用户进行spaming.

除了Silverlight安全模型之外,我宁愿不等待下载完成之后再被问到放在哪里!