.NET: Как Escape закрывает MessageBox.Show ()? - PullRequest
15 голосов
/ 12 февраля 2009

Принимая код:

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.

Смежный вопрос: Как включить «X» в правом верхнем углу MessageBox. Как разрешить пользователю прерывать работу?


В некотором роде, как диалоговое окно подтверждения Windows Explorer позволяет нажать escape для отмены.

Это похоже на то, как диалоговое окно подтверждения Internet Explorer позволяет нажимать escape для отмены.

Примерно так, как диалоговое окно подтверждения Outlook позволяет нажать escape для отмены.

Вроде как каждый диалог в истории вселенной позволяет пользователю нажимать escape или нажимать X, чтобы сказать:

"Я понятия не имею, что ты спрашивая меня, пожалуйста, только не ломай меня компьютер. "


Из руководящих принципов Vista UX

Используйте кнопки «Да» и «Нет» только для ответа на вопросы «да» или «нет». основная инструкция должна быть естественно выражается как вопрос да или нет. Никогда не используйте OK и Отмена для да или нет вопросы.

Ответы [ 6 ]

12 голосов
/ 12 февраля 2009

Вы должны включить опцию «Отмена» со значением перечисления «MessageBoxButtons.YesNoCancel»

Это вернет DialogResult.Cancel

enter image description here

3 голосов
/ 12 февраля 2009

Я не верю, что это возможно, хотя типичным эквивалентом является указание одного из MessageBoxButtons флагов с Отмена (в частности, YesNoCancel в вашем случае) .

Было бы довольно просто воссоздать вашу собственную функцию MessageBox с этой функцией, если вы действительно этого хотите, хотя на самом деле Отмена делает свою работу.

1 голос
/ 12 февраля 2009

Звучит как MessageBoxButtons.OkCancel - это то, что вы ищете, вы просто зациклены на том факте, что вопрос не соответствует Ok / Cancel.

Теоретически вы можете написать свою собственную форму MessageBox, которая делает то же самое и ассоциирует Нет с клавишей 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);

Просто пример, но это, вероятно, самое простое решение вашей дилеммы.

1 голос
/ 12 февраля 2009

Я думаю, MessageBox (как в WinForms, так и в WPF) является одним из тех компонентов, которые лучше всего переопределить. Его поведение настолько жесткое, что любой вид рефакторинга практически невозможен. Короче говоря, сверните свое собственное - таким образом вы можете заставить Escape закрыть его, и все, что вам может потребоваться.

В CodePlex есть проект под названием InfoBox , который может быть вам полезен.

1 голос
/ 12 февраля 2009

В дополнение к другим ответам, вероятно, плохая практика - разрешать пользователю закрывать диалог с помощью escape, если только он не показывает кнопку «Отмена», поскольку это отличается от поведения по умолчанию, которое пользователи ожидают от приложений Windows, и они могут стать неопределенными, так как на какое действие они просто нажали клавишу выхода.

Как уже упоминалось, добавление кнопки «Отмена» автоматически создаст желаемый эффект.

1 голос
/ 12 февраля 2009

Я подозреваю, что если вы включите MessageBoxButtons.YesNoCancel, по умолчанию Escape будет настроен на отмену, что вернет MessageBoxResult of Cancel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...