【问题标题】:.NET: How to have Escape close a MessageBox.Show()?.NET:如何让 Escape 关闭 MessageBox.Show()?
【发布时间】:2009-02-12 18:30:45
【问题描述】:

假设代码:

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);

如果用户按下Escape,我希望它关闭消息框,Show() 方法可以返回DialogResult.None

相关问题:如何启用 MessageBox.Show 右上角的“X”让用户中止?


有点像 Windows 资源管理器确认对话框如何让您按转义键中止。

有点像 Internet Explorer 确认对话框让您按退出键的方式。

有点像 Outlook 确认对话框如何让您按转义键中止。

有点像宇宙历史中的每一个对话框都让用户按下退出键,或者点击 X,来表达:

“我不知道你是什么 问我,请不要破坏我的 电脑。”


From the Vista UX Guidelines

仅使用是和否按钮来回答是或否问题。 主要指令自然应该是 表示为是或否的问题。 永远不要使用 OK 和 Cancel 表示是或否 问题。

【问题讨论】:

    标签: .net winforms dialog modal-dialog


    【解决方案1】:

    您必须使用枚举值“MessageBoxButtons.YesNoCancel”启用“取消”选项

    这将返回 DialogResult.Cancel

    【讨论】:

    • 或 MessageBoxButtons.OKCancel
    • 除了取消不是对“您确定要...”问题的有效答案
    • ...并且 escape 不是“是或否?”的有效答案
    • Escape 根本不是答案,它是“天哪,我做了什么,我不知道!”
    • @IanBoyd 类似“你确定要删除它吗?”当然有资格按下“哦该死的不”转义按钮......但在这种情况下是/否/取消似乎很愚蠢。
    【解决方案2】:

    我不相信这是可能的,尽管典型的等价物是用 Cancel 指定 MessageBoxButtons 标志之一(在您的情况下特别是 YesNoCancel)。

    如果你真的想要的话,用这个特性重新创建你自己的 MessageBox 函数应该是相当简单的,尽管 Cancel 确实可以完成这项工作。

    【讨论】:

      【解决方案3】:

      除了其他答案之外,允许用户使用转义关闭对话框可能是不好的做法,除非它显示“取消”按钮,因为这与用户期望的 Windows 应用程序的默认行为不同,并且它们可能会变得不确定,因为他们刚刚通过按退出键执行了哪个操作。

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

      【讨论】:

      • Escape 的意思是,“哦该死,我不是故意的,假装我没有做任何让这件事出现的事情。”
      • 昨天遇到了同样的问题,我认为你的答案是最好的。 OkCancel 意味着,您接受您正在做的事情的后果或完全取消并且没有任何反应。按 Escape 我通常也会期待这种行为。另一边的 YesNo 将进一步处理,只是针对不同后果的转换。这就是为什么取消是第三种选择,没有任何后果。 “删除这个对象。你想把它放在回收站吗?”否意味着完全删除它,是意味着将其保留在回收站中。反正都删了。如果您添加取消,则不会发生任何事情。
      【解决方案4】:

      我怀疑如果你包含 MessageBoxButtons.YesNoCancel,默认情况下 Escape 被连接到取消,这将返回一个取消的 MessageBoxResult。

      【讨论】:

      • 如果用户点击“否”和“取消”是什么意思?
      • No 和 Cancel 在这种情况下的含义基本相同。 YesNoCancel 适用于“您想在关闭 HelloWorld 之前保存对文档的更改吗?”之类的内容。是的:请保存。否:关闭而不保存。取消:不关闭也不保存,直接返回。
      • 但是两者本质上都是做同样的事情,这就是为什么我们想要一个转义选项!我不知道为什么微软会错过它!现在即使 No 和 cancel 意味着不同的东西,为什么我不能逃避 YesNo 对话框!我推出了自己的一个来解决这个问题..
      【解决方案5】:

      我认为MessageBox(WinForms 和 WPF 中的那个)是最好重新定义的组件之一。它的行为如此僵化,以至于几乎不可能进行任何形式的重构。简而言之,滚动你自己的 - 这样你就可以让 Escape 关闭它,以及你可能需要的任何其他东西。

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

      【讨论】:

        【解决方案6】:

        这听起来像 MessageBoxButtons.OkCancel 是您正在寻找的,您只是挂断了问题与 Ok/Cancel 不匹配的事实。

        理论上,您可以编写自己的 MessageBox 表单来执行相同的操作并将 No 与 Escape 键相关联,这将完全实现您想要的,但需要一些额外的工作。

        另一种选择是改写您的问题,例如:

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

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

        【讨论】:

        • 可用性与易用性。嗯
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 2013-07-23
        相关资源
        最近更新 更多