我使用以下代码:
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选项的完整枚举