【问题标题】:Dialogs must be user-initiated exception after user click用户单击后,对话框必须是用户启动的异常
【发布时间】:2014-04-01 10:10:27
【问题描述】:

我有以下代码,但在 ofd.ShowDialog() 上仍然遇到“对话框必须由用户启动”异常;

    private void btnOpen_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = ALLOWED_FILE_TYPES;
        ofd.FilterIndex = 1;
        ofd.Multiselect = false;
        bool? userClickedOK = ofd.ShowDialog();

        if (userClickedOK == true)
        {.....}
    }

来自 MSDN:

此外,在用户启动对话框和显示对话框之间允许的时间有限制。如果超过这些动作之间的时间限制,就会发生异常。

我看不到点击事件后的几行是如何占用这个时间限制的。

关于如何避免这种情况的任何建议?

谢谢

【问题讨论】:

  • 我不明白你为什么要将ShowDialog() 结果分配给一个可以为空的布尔类型对象,然后对照true 进行检查。
  • 按照网上找到的一些教程,例如在silverlightshow.net/items/… 中完成的,不要认为这是导致问题的原因,因为我只是将其更改为 if(ofd.ShowDialog() == true) 并得到了同样的例外
  • 以上应该是ofd.ShowDialog().Value == true..虽然结果相同。
  • 你是直接从按钮点击事件中调用btnOpen_Click吗?
  • 是的,它在控件的加载事件中使用this.btnOpen.Click += new RoutedEventHandler(btnOpen_Click); 绑定到点击

标签: c# silverlight openfiledialog


【解决方案1】:

好的,我自己还没有测试过,但也许我在一个非常相似的 SO 问题/答案中找到了提示:

private OpenFileDialog OpenFileDialog {get;set;}

public Ctor()
{
    OpenFileDialog = new OpenFileDialog();
}

private void btnOpen_Click(object sender, RoutedEventArgs e)
{
    ...
    ... OpenFileDialog.ShowDialog();
    ...
}

constructor 中实例化对话框,并且仅在您的按钮单击处理程序中调用ShowDialog 方法,而不实例化新对话框。

[编辑] 就是我提到的question/answer

【讨论】:

    【解决方案2】:

    我找到了原因。 Loaded 事件在构造函数中被订阅,虽然构造函数只为控件调用一次,但加载的偶数被调用了两次,因此btnOpen_Click 事件被订阅了两次。 我可以通过取消订阅控件卸载事件中的加载事件来修复它,但我仍然不确定为什么 Loaded 被调用两次。

    【讨论】:

    • 为什么要使用Loaded 事件?它在模板化控件中吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多