【问题标题】:Why is return from MessageBox.Show not "DialogResult.Cancel" when the close button is pressed?为什么按下关闭按钮时从 MessageBox.Show 返回而不是“DialogResult.Cancel”?
【发布时间】:2015-08-19 05:57:41
【问题描述】:

我正在使用以下代码:

Dim Reply As DialogResult = MessageBox.Show("GOT IT!")
If Reply = DialogResult.OK Then '...` 

当我单击Close 按钮(角落中的红色“X”)时,寻找DialogResult.OK 的条件仍为真,当我在单击关闭按钮后在运行时检查Reply 变量的值时,它是@ 987654329@。

MessageBox Class 上的文档说:

显示消息窗口,也称为对话框,其中 向用户显示消息。它是一个模态窗口,挡住了其他 应用程序中的操作,直到用户关闭它。一个 MessageBox 可以 包含通知和指导用户的文本、按钮和符号。

虽然我发现DialogBoxes 上的文档有点令人费解和困惑,但在我看来(我可能错了)Close 按钮默认情况下应该将返回设置为IDCancel,我必须假设以某种方式被MessageBox 类解析为DialogReturn.Cancel

那么为什么MessageBox 没有将关闭按钮的返回表单显示为DialogResult.Cancel??


这一切都让我很困惑,因为 MessageBox 类似乎与同一 Systems.Windows.Forms 命名空间中的其他形式不一致。

例如,如果我们查看Form Class's .DialogResult方法的文档,它明确告诉我们关闭按钮的返回是DialogResult.Cancel

当表单显示为模式对话框时,单击关闭 按钮(表单右上角带有 X 的按钮) 导致表单被隐藏并设置 DialogResult 属性 到 DialogResult.Cancel。

【问题讨论】:

  • 这不会按原样编译。你是说Dim Reply = MessageBox.Show("GOT IT!") 吗?
  • 只有在添加包含取消选项的 MessageBoxButtons 枚举时才能获得 IDCancel IE MessageBoxButtons.OKCancel
  • This is from the WinAPI version,不是真正可靠的证明参考,但有关返回值的部分讨论了取消按钮存在时的行为,然后反复试验确认此行为
  • 如果您没有将取消指定为第三个参数的按钮选项之一,则 X 不会映射到您未指定的合法结果。红色“X”不会启用事件。您使用的表单 - 未指定按钮 - 与 OKOnly 相同
  • 如果你指定了像“Abort Retry Ignore”这样没有定义Cancel的按钮,它不会被启用。那个令人毛骨悚然的简短形式实际上并不是一个对话框,而是一个简单的消息框。更大的一点是,它不会返回您未指定为有效的值。

标签: vb.net forms messagebox


【解决方案1】:

如上面的 cmets 中所述,只有在添加包含取消选项的 MessageBoxButtons 枚举时,单击关闭红色按钮时才能获得 IDCancel 结果,例如 MessageBoxButtons.OKCancel 和其他人。

MessageBox.Show 方法确实是WinApi MessageBox 函数的包装。你可以看到这个包装看着reference sources

MessageBox.Show 的行为与您所指向的链接不同。那是相对于 WinForm 引擎的,当然 WinForm Form 类的行为完全由库管理,以处理假定为 WinForm 类的场景。

在 WinApi 文档中,您可以在有关返回值的部分找到一个微妙的参考,其中他们讨论了取消按钮存在时的行为。然后反复试验证实了这个假设。

【讨论】:

    【解决方案2】:

    您需要将 MessageBoxButtons 作为包含取消按钮的覆盖传递,例如 MessageBoxButtons.OKCancel。

    Dim message As String = "GOT IT!"
    Dim caption As String = "Fancy Caption"
    Dim Reply As DialogResult = MessageBox.Show(message, caption, MessageBoxButtons.OKCancel)
    If Reply = DialogResult.OK Then '...` 
    

    如果你不想要标题而不是跳过它,但你仍然需要一个逗号,例如:

    MessageBox.Show("GOT IT!",,MessageBoxButtons.OKCancel)
    

    有关 MessageBoxButtons 选项的完整枚举,请参阅 here

    【讨论】:

    • 感谢 JasonHughes - 但您能否详细说明为什么我需要提供一个包含Cancel 按钮的枚举器?我的问题不是如何获得取消按钮,而是为什么返回首先不起作用 - 我想了解这背后的本质。谢谢!!
    • 我相信因为你在寻找平等。您正在查看仅包含 Ok 选项的 DialogResult 是否等于 DialogResult.Ok。您也许可以使用包含默认按钮的覆盖并将其设置为取消。自从我涉足winforms以来已经有一段时间了。开箱即用我相信默认是第一个按钮,所以如果你只有一个 OK 按钮而不是默认按钮。我必须打开一个 IDE 并确认。
    • MessageBox 类也继承自 Object 类而不是 Forms 类,并且它们都有一个称为 DialogResult 的东西。因此,即使它们在同一个程序集中,它们也不是完全相同类型的对象,MessageBox 的 DialogResult 似乎更适合 MessageBox UI。
    • 感谢您的回复和解释-您说的很有道理。我选择史蒂夫的答案是因为他提供了对 MSDN Source 的参考,该参考显示了定义您描述的行为的 WinAPI 函数,但我敢说这两个答案都是正确的 :)
    猜你喜欢
    • 2013-02-23
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多