为什么按下关闭按钮时从 MessageBox.Show 返回不"DialogResult.Cancel"?



我使用以下代码:

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

当我点击Close按钮(红色"X"在角落)的条件寻找DialogResult.OK仍然评估为真,当我检查Reply变量的值在运行时点击关闭按钮后,它是1 {OK}

从MessageBox类的文档中它说:

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

虽然我发现关于对话框的文档有点令人费解和困惑,但在我看来(我可能是错误的),Close按钮应该默认设置返回IDCancel,我必须假设是由MessageBox类以某种方式解析为DialogReturn.Cancel

那么为什么MessageBox不显示关闭按钮作为DialogResult.Cancel的返回??


这对我来说都很困惑,因为似乎MessageBox类与同一Systems.Windows.Forms名称空间内的其他形式不一致。

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

当窗体显示为模态对话框时,单击Close按钮(窗体右上角带有X的按钮)导致窗体被隐藏,并设置dialgresult属性DialogResult.Cancel。

正如上面的评论所述,当单击关闭红色按钮时,您可以获得IDCancel结果,只有当您添加包含取消选项的MessageBoxButtons enum时,例如MessageBoxButtons。OKCancel和其他

MessageBox.Show方法实际上是WinApi MessageBox函数的包装器。在参考源代码

中可以看到这种换行

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

在WinApi文档中,你可以在关于返回值的部分找到一个微妙的参考,在那里他们谈到了取消按钮出现时的行为。然后反复试验证实了这一假设。

你需要传递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选项的完整枚举

最新更新