.NET: Как избежать Escape закрыть MessageBox.Show()?

Предполагая код:

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 и Cancel для вопросов да или нет.

Ответы

Ответ 1

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

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

Ответ 2

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

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

enter image description here

Ответ 3

Я подозреваю, что если вы включили MessageBox.YesNoCancel, по умолчанию Escape подключен для отмены, который вернет MessageBoxResult Отмена.

Ответ 4

В дополнение к другим ответам, вероятно, неправильная практика позволяет пользователю закрыть диалог с побегом, если только он не показывает кнопку "Отмена", поскольку это отличается от поведения по умолчанию, которое пользователи ожидают от приложений Windows, и они могут стать неопределенными, поскольку к какому действию они только что сделали, нажав клавишу эвакуации.

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

Ответ 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);

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