В WPF, как я могу дублировать старую функциональность WinForms OnKeyPressed? - PullRequest
2 голосов
/ 16 мая 2011

У нас есть приложение WPF, в котором нам нужно определить, печатает ли пользователь что-то, что может появиться в текстовом поле. У WinForms раньше было хорошее переопределение OnKeyPressed, которое отличалось от OnKeyDown тем, что оно вызывалось только тогда, когда печатался печатный символ (например, оно различалось между «A» и «a», но не между «1» в верхней строке и цифровая клавиатура. Также игнорируются такие клавиши, как «Shift» и т. д.) Нам нужно продублировать эту функцию в WPF.

Теперь я знаю, что могу переопределить OnKeyDown и проверить код ключа, но это означает, что нужно вручную проверять каждый возможный ключ, который может привести к появлению чего-либо в текстовом поле. Похоже, это консенсус по другим подобным SO-вопросам, которые я нашел, но я просто не могу поверить, что что-то настолько простое было бы исключено из API.

Помимо «монстра if-дерева», одним из «хакерских» решений является использование текстового поля в памяти, передача ему кода ключа, а затем проверка длины текста. Но меня тошнит, даже печатая это как возможное решение! UGH !! Я чувствую себя грязным!

ТАК ... как проще всего узнать, нажал ли пользователь клавишу или клавиши, которые приведут к печатному символу?

ТИА

Mark

1 Ответ

3 голосов
/ 16 мая 2011

На самом деле, я думаю, что только что нашел это, поэтому я публикую ответы для других. Вы не используете какие-либо «ключевые» события вообще. WPF более четко отделяет их от текстовых значений. Таким образом, вы переопределяете функции OnPreviewTextInput и / или OnTextInput. Чтобы получить то, что было действительно напечатано, проверьте свойство .Text в аргументах события, которое возвращает простую строку.

Готово и готово!

Надеюсь, это поможет другим! Подвез меня до стены!

...