【发布时间】:2011-12-21 21:26:51
【问题描述】:
我的应用有一个“打开文件”按钮。在启动 OpenFileDialog 之前,它会询问用户是否要保存当前文件,如果是,它会启动 SaveFileDialog。然后它启动 OpenFileDialog。很标准的东西。
我的问题是,silverlight 将 OpenFileDialog.ShowDialog() 方法视为不是用户启动的,因此我得到了 SecurityException。
是否有任何已知的合理方法可以避免此异常?当然这是一个非常标准的场景?
应用在浏览器中。
欢迎任何想法
编辑:
抱歉,不允许发布实际代码 :( 不过逻辑非常简单:在伪代码中,“OpenFile”按钮按下事件调用类似以下的方法:
*启动一条新的 SL 消息,询问是否先保存。
*在消息窗口上单击是/否: - 如果没有,请转到加载 - 如果是,启动 SaveFileDialog.ShowDialog(),去加载
*加载: 启动打开文件对话框
编辑 2: 小程序...
主页的 XML 内容:
<Grid x:Name="LayoutRoot" Background="White">
<Button Content="Open" Click="Button_Click"/>
</Grid>
代码:
using System.Windows;
using System.Windows.Controls;
namespace SilverlightApplication15
{
public partial class MainPage : UserControl
{
AskWindow aw = new AskWindow();
public MainPage()
{
InitializeComponent();
aw.Closed += new System.EventHandler(aw_Closed);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
aw.Show();
}
private void aw_Closed(object sender, System.EventArgs e)
{
if (aw.DialogResult == true)
{
SaveFileDialog svd = new SaveFileDialog();
svd.ShowDialog();
}
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();//Causes security exception
}
}
public class AskWindow : ChildWindow
{
public AskWindow()
{
Button b = new System.Windows.Controls.Button();
b.Click += new System.Windows.RoutedEventHandler(b_Click);
b.Content = "Yes, save it";
this.Content = b;
}
private void b_Click(object sender, System.Windows.RoutedEventArgs e)
{
this.DialogResult = true;
}
}
}
【问题讨论】:
-
你能把你的代码贴出来吗。
-
您是否尝试过为 ShowDialog() 编写扩展方法,例如 ShowDialog(string question),它首先显示 MsgBox,然后可能调用基本的 ShowDiaglog()?
-
@neurotix:我试了一下;恐怕同样的结果:(
-
嗯,典型的方法是先调用 SaveFileDialog 的 ShowDialog(),然后是 OpenFile()。我假设(根据上面的伪代码)您实际上跳过了 ShowDialog()。对吗?
-
不,它没有被跳过。请再说一遍;我已经更正了我写的内容。如果用户要求保存,则会启动 SaveFileDialog(即“ShowDialog()”)。在 SL 中,这会冻结线程,直到对话框关闭。然后,一旦 SaveFile 对话框关闭,它就会移动到 OpenFileDialog.ShowDialog() 位
标签: c# silverlight openfiledialog savefiledialog