.NET:如何使 Escape 键关闭 MessageBox.Show()?

18
假设代码为:
MessageBox.Show(this, 
       "Would you like the differential girdle spring on the up-end of the grammeters?", 
       "Smi-Boloid Stater Slots", 
       MessageBoxButtons.YesNo, 
       MessageBoxIcon.Warning);

alt text

如果用户按下Escape键,我希望它关闭消息框,并且Show()方法可以返回DialogResult.None
相关问题:如何启用MessageBox.Show上方右侧的“X”以让用户中止?

就像Windows资源管理器确认对话框一样,您可以按Esc键来中止。

就像Internet Explorer确认对话框一样,您可以按Esc键来中止。

就像Outlook确认对话框一样,您可以按Esc键来中止。

就像宇宙历史上的每个对话框一样,用户都可以按下Esc键或点击X来表示:

"我完全不知道你在问什么,请不要破坏我的电脑。"


来自Vista UX指南

仅在回答是或否问题时使用“是”和“否”按钮。主要指令应该自然地表达为一个是或否的问题。永远不要在是或否问题中使用“确定”和“取消”。

6个回答

12

您需要使用枚举值为"MessageBoxButtons.YesNoCancel"来启用"取消"选项。

这将返回DialogResult.Cancel。

输入图像描述


1
或 MessageBoxButtons.OKCancel - Powerlord
除了取消之外,"您确定要..."的问题没有有效的答案。 - Ian Boyd
1
......而“逃避”不是“是或否”的有效答案。 - BC.
2
逃避根本不是答案,而是“天啊,我做了什么,我不知道!” - Ian Boyd
@IanBoyd 像“您确定要删除吗?”这样的内容肯定会让人按下“哦,不!”的取消按钮……但在这种情况下,是/否/取消似乎有点愚蠢。 - Nyerguds

4
我不相信这是可能的,虽然典型的等价物是使用其中一个MessageBoxButtons标志和取消(在您的情况下特别是YesNoCancel)。
如果你真的想要这个功能,通过使用这个特性重新创建你自己的MessageBox函数应该是相当简单的,尽管实际上取消已经可以胜任这项工作。

2

除了其他答案之外,如果没有“取消”按钮,允许用户使用Escape关闭对话框可能是不好的实践,因为这与用户从Windows应用程序中期望的默认行为不同,他们可能会不确定按下Escape键后采取了哪个操作。

如前所述,添加“取消”按钮将自动创建所需的效果。


转义意味着:“哦,该死,我不是故意这样做的,请假装我没有做出任何让这个东西出现的事情。” - Ian Boyd
昨天我问了同样的问题,我认为你的答案是最好的。 OkCancel 意味着你接受你所做的后果或完全取消而不会发生任何事情。按下 Escape 键时,我通常也会期望这种行为。另一方面,YesNo 将继续处理,并且只是不同后果的开关。这就是为什么 Cancel 是第三个选项,没有后果。 “删除此对象。您要将其保留在回收站中吗?” 否意味着完全删除它,而是意味着只需将其保留在回收站中。无论如何都会被删除。如果添加取消,则不会发生任何事情。 - Matt

1

我怀疑如果你包含MessageBoxButtons.YesNoCancel,那么默认情况下按下Escape键将会取消操作并返回一个MessageBoxResult为Cancel的结果。


1
如果用户选择“否”和“取消”,这意味着什么? - Ian Boyd
在这种情况下,“No”和“Cancel”基本上意思相同。“YesNoCancel”适用于像“在关闭HelloWorld之前,您是否要保存对文档所做的更改?”这样的事情。是:请保存。否:不保存关闭。取消:不要关闭或保存,只需返回。 - JMD
2
但两者本质上都是做同样的事情,这就是为什么我们需要一个逃脱选项!我不知道为什么微软会错过它!即使“否”和“取消”有不同的含义,为什么我不能只是逃脱一个YesNo对话框!我自己编写了一个来解决这个问题。 - nawfal

1

我认为MessageBox(无论是WinForms还是WPF中的)是那些最好重新定义的组件之一。它的行为是如此严格,以至于任何形式的重构几乎是不可能的。简而言之,自己动手实现 - 这样你就可以让Escape键关闭它,并满足其他任何需求。

CodePlex上有一个名为InfoBox的项目,可能对您有用。


1

听起来像是你正在寻找的是MessageBoxButtons.OkCancel,只是你纠结于问题与Ok/Cancel不匹配的事实。

理论上你可以编写自己的MessageBox窗体,将No与Esc键关联起来,这样就可以完成你想要的功能,只需要多做一些额外的工作。

另一个选择是重新表述你的问题,例如:

MessageBox.Show(this, "The following operation will format your computer.\r\nPress Ok to continue, Cancel to abort", "Confirm Format", MessageBoxButtons.OkCancel, MessageBoxIcon.Warning);

这只是一个例子,但很可能是您困境的最简单解决方案。


1
可用性与易用性。嗯。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接