C# 是否有任何方法可以规避;对话框必须由用户启动;例外?
我的应用程序有一个“打开文件”按钮。在启动OpenFileDialog之前,它会询问用户是否要保存当前文件,如果要保存,则会启动SaveFileDialog。然后启动OpenFileDialog。相当标准的东西 我的问题是silverlight随后将OpenFileDialog.ShowDialog()方法视为非用户启动的,因此我得到了一个SecurityException 是否有任何已知的合理方法来避免这种例外情况?这肯定是一个相当标准的场景 该应用程序位于浏览器中 欢迎提出任何意见 编辑: 抱歉,不允许发布实际代码:(虽然逻辑非常简单:在psuedocode中,“OpenFile”按钮按下事件调用类似以下内容的方法: *启动新的SL消息,询问是否先保存 *在消息窗口中单击是/否: -如果没有,请转到加载 -如果是,启动SaveFileDialog.ShowDialog(),转到加载 *负载: 启动“打开文件”对话框 编辑2: 小型节目 主页的XML内容:C# 是否有任何方法可以规避;对话框必须由用户启动;例外?,c#,silverlight,openfiledialog,savefiledialog,C#,Silverlight,Openfiledialog,Savefiledialog,我的应用程序有一个“打开文件”按钮。在启动OpenFileDialog之前,它会询问用户是否要保存当前文件,如果要保存,则会启动SaveFileDialog。然后启动OpenFileDialog。相当标准的东西 我的问题是silverlight随后将OpenFileDialog.ShowDialog()方法视为非用户启动的,因此我得到了一个SecurityException 是否有任何已知的合理方法来避免这种例外情况?这肯定是一个相当标准的场景 该应用程序位于浏览器中 欢迎提出任何意见 编辑:
<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();
}