Как запретить закрывать окно клавишей «Ввод», когда фокус в редактируемом элементе управления в WPF - PullRequest
2 голосов
/ 08 марта 2011

Как предотвратить закрытие окна с помощью клавиши Enter , пока фокус находится в редактируемом элементе управления?

Обычно я делаю Cancel с IsCancel=True и Ok с IsDefault=True. Это связано с тем, что пользователи могут закрыть диалоговое окно с Введите как OK и Esc как Отмена.

Однако проблема заключается в нажатии клавиши Enter , закрывающей диалоговое окно, даже если фокус клавиатуры находится в редактируемом элементе управления, например TextBox. Наилучшее поведение - нажатие клавиши Enter закрывает диалог, только когда фокус клавиатуры не находится в редактируемом элементе управления. Но двойное нажатие клавиши Enter должно закрыть диалоговое окно. В противном случае пользователям необходимо изменить фокус клавиатуры на другой нередактируемый элемент управления, чтобы закрыть его клавишей Enter .

Итак, в качестве обходного пути я реализовал так:

  • Перехват KeyDown события и проверки если это Введите ключ.
  • Если это так, проверьте, находится ли фокус клавиатуры на кнопку Ok.
  • Если это так, закрывает диалог с помощью Ok кнопка. В противном случае измените Фокус клавиатуры на кнопку ОК. Итак, дважды нажмите Enter , чтобы закрыть диалоговое окно.

Это имеет проблему, потому что первый Enter изменит фокус на кнопку Ok, поэтому, если фокус не на кнопке Ok, пользователям нужно дважды нажать Enter . Это мало отличается от идеального поведения. Кроме того, мне нужно реализовать эту логику для каждого диалога.

У кого-нибудь есть хорошая идея, чтобы решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Обработайте PreviewKeyDown и отмените событие.

2 голосов
/ 08 марта 2011

Если искать это конкретное поведение, я бы просто установил некоторое логическое значение в true в обработчике событий KeyDown в первый раз, когда Enter получает удар (вместо переключения фокуса). Затем, на следующем событии KeyDown, я бы проверил, было ли нажатие клавиши Enter и , если Enter было нажано ранее. Чтобы реализовать это более чем в одном диалоге, я бы создал общий диалог, в котором я переопределил бы метод OnKeyDown вместо подписки на событие, а затем создал бы подкласс этого диалога.

(Сказав, что, как пользователь, я бы вообще не хотел этого поведения. Я бы рекомендовал просто игнорировать клавишу Enter , когда он находится в текстовом поле - это то, к чему привыкли пользователи.)

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