Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有任何方法可以规避;对话框必须由用户启动;例外?_C#_Silverlight_Openfiledialog_Savefiledialog - Fatal编程技术网

C# 是否有任何方法可以规避;对话框必须由用户启动;例外?

C# 是否有任何方法可以规避;对话框必须由用户启动;例外?,c#,silverlight,openfiledialog,savefiledialog,C#,Silverlight,Openfiledialog,Savefiledialog,我的应用程序有一个“打开文件”按钮。在启动OpenFileDialog之前,它会询问用户是否要保存当前文件,如果要保存,则会启动SaveFileDialog。然后启动OpenFileDialog。相当标准的东西 我的问题是silverlight随后将OpenFileDialog.ShowDialog()方法视为非用户启动的,因此我得到了一个SecurityException 是否有任何已知的合理方法来避免这种例外情况?这肯定是一个相当标准的场景 该应用程序位于浏览器中 欢迎提出任何意见 编辑:

我的应用程序有一个“打开文件”按钮。在启动OpenFileDialog之前,它会询问用户是否要保存当前文件,如果要保存,则会启动SaveFileDialog。然后启动OpenFileDialog。相当标准的东西

我的问题是silverlight随后将OpenFileDialog.ShowDialog()方法视为非用户启动的,因此我得到了一个SecurityException

是否有任何已知的合理方法来避免这种例外情况?这肯定是一个相当标准的场景

该应用程序位于浏览器中

欢迎提出任何意见

编辑:

抱歉,不允许发布实际代码:(虽然逻辑非常简单:在psuedocode中,“OpenFile”按钮按下事件调用类似以下内容的方法:

*启动新的SL消息,询问是否先保存

*在消息窗口中单击是/否: -如果没有,请转到加载 -如果是,启动SaveFileDialog.ShowDialog(),转到加载

*负载: 启动“打开文件”对话框

编辑2: 小型节目

主页的XML内容:

<Grid x:Name="LayoutRoot" Background="White">
    <Button Content="Open" Click="Button_Click"/>
</Grid>

您的问题的简短回答是“否”,因为silverlight运行时的第二个对话框不再由用户启动。如果在打开对话框之前显示消息框,情况也是如此

这里有一些关于对话框安全限制的信息

出于安全目的,如果Silverlight应用程序是沙盒应用程序,则文件和打印对话框必须由用户启动。这意味着您必须从用户启动的操作(如按钮的单击事件处理程序)中显示它们。如果您尝试从非用户启动的代码中显示对话框,则会发生SecurityException。此外n、 用户启动对话框和显示对话框之间的允许时间有限制。如果超过这些操作之间的时间限制,将发生异常。将Visual Studio调试器与对话框一起使用时,如果在对话框创建和显示之间设置断点,将引发SecurityException由于对话框的原因。由于用户发起的限制,这是预期的行为。如果在调用ShowDialog后设置断点,则不会引发异常

如果尝试从按键事件处理程序和对应用程序代码的其他同步调用(如LayoutUpdated或SizeChanged事件处理程序)显示对话框,将引发异常。但是,当应用程序托管在Internet Explorer中,以保护模式运行时,将不会引发异常

当插件处于全屏模式时,Silverlight插件对对话框的支持有限。在大多数情况下,以全屏模式显示对话框将导致插件恢复到嵌入式模式。但是,为了避免某些浏览器出现问题,您应该在使用这些类之前退出全屏模式。在Silverlight应用程序中如果在浏览器之外运行,则可以向用户显示提示,以全屏模式启用对话框。此外,对于受信任的应用程序,用户启动限制也会放宽。有关详细信息,请参阅受信任的应用程序

时间限制可以通过以下代码轻松测试:

private void OpenDialog(object sender, RoutedEventArgs e) {
  MessageBox.Show("test");

  OpenFileDialog fileDialog = new OpenFileDialog();
  var result = fileDialog.ShowDialog();
}
当您在显示MessageBox时快速按下“Enter”键时,OpenFileDialog随后会显示,不会引发安全异常。但是如果您让MessageBox保持打开状态一小段时间,则在关闭MessageBox后会引发安全异常


我认为时间限制是一个接一个显示两个对话框的问题,因为时间限制将超过显示第一个对话框的时间限制。

您应该立即在鼠标
中显示
SaveFileDialog
。 在您的情况下,将在
私有无效b_中单击


在鼠标单击和保存文件对话框之间设置一些障碍将不起作用。

这可能是桌面应用程序的标准方案,但您并不是在创建桌面应用程序。您正在创建一个在安全沙盒中运行的组件,并且有一些非常严格的限制

没有灵巧的方法来处理这种情况。你可以提供一个关闭的“文档”功能,它将弹出一个确认框,警告继续将丢失工作

如果试图在当前“文档”未保存的情况下打开另一个“文档”,您所能做的就是显示消息,指示用户进行选择,关闭当前“文档”并放弃其更改或选择保存。用户必须手动执行这些操作,然后再次选择打开“文档”


如果你的应用程序支持多个“打开”文档,你可能会有所改进,至少用户不会因为打开一个“文档”而被征税。

你能发布你的代码吗?你是否尝试过为ShowDialog()编写扩展方法,比如ShowDialog(字符串问题)这将首先显示MsgBox,然后可能调用基本的ShowDiaglog()?@Neurtix:我刚刚尝试了一下;恐怕结果也是一样:(典型的调用路线是先调用SaveFileDialog的ShowDialog(),然后调用OpenFile()。我假设(从上面的伪代码)您实际上跳过了ShowDialog()。是吗?不,没有跳过。对不起,我已经更正了我写的内容。如果用户要求保存,将启动SaveFileDialog(即“ShowDialog()”)。在SL中,这将冻结线程,直到对话框关闭。然后,一旦SaveFile对话框关闭,它将转到OpenFileDialog。ShowDialog()bitHey感谢您的回答。不过有一个问题:为什么openfiledialog与消息框的处理方式不同?例如,以下情况不会导致异常,但仍然会对用户进行“垃圾邮件”处理(int i=0;i<1000000;i++){MessageBox.Show(“垃圾邮件!”;}@user495625:消息框仅显示文本,而OpenFileDialog/SaveFileDialog用于访问本地文件和资源,因此具有更高的安全性
private void OpenDialog(object sender, RoutedEventArgs e) {
  MessageBox.Show("test");

  OpenFileDialog fileDialog = new OpenFileDialog();
  var result = fileDialog.ShowDialog();
}