Silverlight为了安全是不允许你直接在非人为触发的环境下使用SaveFileDialog等对话框类. 必须在用户鼠标或者键盘事件的调用代码中才能够调用它的ShowDialog方法. 如果违反了就会出现"System.Security.SecurityException: 对话框必须由用户启动。"异常了.
这个条件其实是不充分的, 其实即便是是鼠标点击仍然还会出现这样的错误. 看一下这段代码
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { Thread.Sleep(1000); var saveDlg = new SaveFileDialog(); saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg"; saveDlg.DefaultExt = ".jpeg"; try { if ((bool)saveDlg.ShowDialog()) { } } catch (Exception exception) { MessageBox.Show(exception.ToString()); } }
这段代码时会恒定出错的, 移除Thread.Sleep(1000);是没有问题的. 这里说明了, 这个权限是有时限的, 如果从用户触发到调用ShowDialog不在1秒内那么就会报SecurityException.
这个不能算是个bug, 因为的确没有很好的方法来检查是用户触发的代码调用还是程序员自己写的代码调用.