Проблема с попыткой перехватить и перехватить все отдельные события, которые могут вызвать изменение свойства TextBox.Text, состоит в том, что существует много таких событий:
- TextInput: пользовательские типы
- KeyDown: Delete, Backspace, Enter, IME
- Командные жесты: Ctrl-X, Ctrl-Y, Ctrl-V, Ctrl-X
- MouseDown: кнопка вставки, кнопка вырезания, кнопка отмены, ...
- Щелчок: пробел нажимается, когда кнопки Вставить, Вырезать, Отменить имеют локальный фокус
- RaiseEvent: код вызывает команды Вставить, Вырезать, Отменить, Повторить
- Доступность: голосовые команды, клавиатура Брайля и т. Д.
Попытка надежно перехватить все это бесполезное упражнение. Гораздо лучшим решением является мониторинг TextBox.TextChanged и отклонение изменений, которые вам не нравятся.
В этот ответ Я покажу, как реализовать класс TextBoxRestriction для конкретного запрашиваемого сценария. Эту же технику можно обобщить для использования с любыми ограничениями, которые вы хотите наложить на свой элемент управления TextBox.
Например, в вашем случае вы можете внедрить RestrictValidChars
присоединенное свойство аналогично RestrictDeleteTo
свойству в этом коде. Это будет то же самое, за исключением того, что внутренний цикл будет проверять вставки, а не удаления. Это будет использовано так:
<TextBox my:TextBoxRestriction.RestrictValidChars="0123456789" />
Это просто идея того, как с этим можно обращаться. Есть много способов структурировать ваш код в зависимости от того, что вы хотите. Например, вы можете изменить TextBoxRestriction, чтобы вызывать собственный код для проверки с использованием присоединенного свойства, которое принимает делегат или объект, содержащий событие.
См. В другом ответе подробности о том, как связать свойство Text, когда вы используете класс TextBoxRestriction, чтобы оно не вызывало ограничение, когда вы этого не хотите.