【问题标题】:Setting DialogResult only after ShowDialog() in WPF仅在 WPF 中的 ShowDialog() 之后设置 DialogResult
【发布时间】:2009-09-04 11:10:26
【问题描述】:

我有一个窗口,有时使用Show() 打开,有时使用ShowDialog() 打开。在第二种情况下,返回的对话结果对我来说很重要。但是如果我在调用Show() 之后设置DialogResult,我会得到InvalidOperationException。有没有办法找出使用哪种方法打开窗口并相应地设置DialogResult?还是有别的办法?

当然我知道我可以捕获并忽略异常,但我不喜欢这种解决方案。

【问题讨论】:

    标签: wpf dialog


    【解决方案1】:

    在窗口内使用System.Windows.Interop.ComponentDispatcher.IsThreadModal 来确定它是否在模态线程上运行。

    【讨论】:

    • 并不总是有效,在我们的例子中,我们必须包装 DialogResult = x;调用 try/catch 以获得正确的行为。
    【解决方案2】:

    如果您查看 Reflector 中的 set_DialogResult,它会检查 _showingAsDialog 以确定对话框是否是模态的。不幸的是,这是一个私有字段。

    你总是在调用 Show()/ShowDialog() 之前构造一个新的窗口实例吗?如果是这样,您可以将参数传递给构造函数,指示它如何显示。

    【讨论】:

      【解决方案3】:

      您可以使用Form.Modal 属性来检查使用类型。

      在使用Form.Show() 的情况下,您必须使用另一种方式让调用者知道表单的任何结果。

      是否有理由同时使用两种显示形式?

      【讨论】:

      • WPF 中不存在该属性
      【解决方案4】:

      在表单关闭事件中设置 this.DialogResult = DialogResult.blah 怎么样?

      【讨论】:

      • 这有什么帮助?即使在 Show() 之后仍然会设置它并导致异常。顺便说一句,我使用 WPF(我没有明确指定)所以 DialogResult 是 bool?。
      • 在我这样做之前。关闭();在模态窗口中我设置了 this.DialogResult = DialogResult.OK;在主要形式中,这正是我得到的。谢谢你sgrassie :)
      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2011-12-01
      • 2015-04-18
      • 2011-10-07
      相关资源
      最近更新 更多