Различия между ними зависят от того, какой тип символа вы печатаете.
- Стандартный ключ: печатаемые символы, такие как «a», «A», «5», «%», «Backspace» и т. Д.
- Клавиша управления: Ctrl + C, Ctrl + H, Ctrl + M и т. Д.
- Код десятичного ключа: такие вещи, как Alt + numpad 2 5 5 (для кода расширенного ASCII IBM 255, который является неразрывным пробелом Unicode U + 00A0) и Alt + numpad 0 2 5 5 (для Windows Код ANSI 255, который является Unicode U + 00FF). Вероятно, также будет применяться к Alt + numpad плюс 2 6 3 B (для U + 263B), если у вас есть параметр реестра , чтобы включить его ; Я не подтвердил это. (Я установил параметр реестра, но он не имел немедленного эффекта; вероятно, требуется перезагрузка.)
- Мертвые клавиши: Я понимаю, что у многоязычных клавиатур есть дополнительные вещи, называемые "мертвыми клавишами", которые изменяют следующее нажатие клавиши. Например, вы можете нажать «мертвую» клавишу «umlaut», после которой следует «o», которая «наберет» an & ouml; (Умляут). (У меня могут быть неправильные детали. Я всегда использовал en-US клавиатуру, и я не знаю, как это сделать, чтобы использовать мертвые клавиши.) Я подозреваю, что они будут вести себя подобно кодам десятичных клавиш; см. ниже.
- IME: В идеографических языках используется нечто, называемое «Редактор метода ввода». Я знаю об этом даже меньше, чем о мертвых ключах, и понятия не имею, запускают ли они эти события или нет.
Обратите внимание, что клавиши-модификаторы, такие как Shift и Ctrl, не запускают эти события напрямую (в отличие от KeyDown, где вы видите нажатие Shift, затем нажатие клавиши 5 и т. Д.). Например, Shift + 5, чтобы получить «%», генерирует только одну последовательность событий (то есть один TextInputStart и один TextInput), причем оба получают строку «%».
TextInputStart запускается всякий раз, когда вы начинаете вводить символ или код символа. Он срабатывает, когда вы нажимаете стандартную клавишу, клавишу управления или первую цифру десятичного кода клавиши. Когда это срабатывает, система иногда, но не всегда, уже знает, какую клавишу вы нажимаете (как в случае стандартных клавиш и клавиш управления). Если он знает, он скажет вам в TextCompositionEventArgs; если он не знает, TextCompositionEventArgs пуст и ничего вам не говорит.
TextInputUpdate запускается при вводе второй и последующих цифр десятичного кода ключа. Я еще не видел ничего, кроме пустого TextCompositionEventArgs для этого события (хотя возможно, что это меняется с мертвыми ключами или IME).
TextInput срабатывает, когда вы закончите вводить ключ, и система точно знает, какой ключ вы ввели, поэтому всегда имеет полезную информацию в TextCompositionEventArgs. Это событие означает, что символ фактически «набирается» сейчас (то есть соответствует тому, когда символ появился бы, если бы вы печатали в TextBox).
Итак, вот как работают последовательности событий для разных типов символов:
Стандартная клавиша: Как только вы нажимаете клавишу, вы сразу получаете TextInputStart, за которым следует TextInput. Оба имеют одинаковое содержимое в своих TextCompositionEventArgs: e.Text и e.TextComposition.Text оба установлены для клавиши, которую вы нажали. (Обратите внимание, что это не всегда печатный символ. Если вы нажимаете клавишу Backspace, он находится в текстовом формате e.Text.) Если удерживать клавишу нажатой, вы получите пару событий (TextInputStart / TextInput) для каждого повторения клавиши.
Клавиша управления: Как только вы нажимаете буквенную клавишу, вы сразу получаете TextInputStart, за которым следует TextInput. Оба имеют одинаковое содержимое в своих TextCompositionEventArgs: e.ControlText и e.TextComposition.ControlText оба установлены на нажатой клавише управления. Если удерживать буквенный ключ, вы получите пару событий (TextInputStart / TextInput) для каждого повторения ключа.
Код десятичной клавиши: Допустим, вы набираете Alt + numpad 0 2 5 5. Как только вы нажимаете numpad 0, вы получаете событие TextInputStart, которое абсолютно ничего вам не говорит. Для каждого из нажатий клавиш numpad 2, numpad 5 и numpad 5 вы получаете событие TextInputUpdate, опять же без полезной информации (вы не можете сказать, какие цифры были нажаты до сих пор). Когда вы отпускаете клавишу Alt (которая фактически «печатает» ключ, код которого вы ввели), вы получаете событие TextInput с ключом, который вы ввели в свойствах e.Text и e.TextComposition.Text. (Это может быть непечатаемый символ, например, если вы ввели Alt + numpad 0 8.) Повторение клавиш невозможно для десятичных кодов клавиш.
Мертвый ключ: Как я упоминал выше, я не знаю, как это проверить. Если у кого-нибудь есть ответ, дайте мне знать, и я включу его здесь.
IME: Опять же, я не знаю, как это проверить.
У меня сложилось впечатление, что для большинства случаев TextInput - единственное из этих событий, которое имеет смысл использовать (поскольку два других не всегда говорят вам что-либо). Вероятно, поэтому это единственное из трех, которое повторно представлено как стандартное перенаправленное (не присоединенное) событие в UIElement, UIElement3D и ContentElement.