Вставить событие в текстовом поле WPF

Я создал настраиваемый элемент управления, наследующий TextBox . Этот настраиваемый элемент управления представляет собой числовой TextBox блок, поддерживающий только номера.

Я использую OnPreviewTextInput чтобы проверить каждый новый символ, набираемый, чтобы увидеть, является ли символ допустимым. Это отлично работает. Однако, если я OnPreviewTextInput текст в TextBox , OnPreviewTextInput не запускается.

Каков наилучший способ захватить вложенный текст в TextBox ?

Кроме того, у меня проблема при нажатии на обратное пространство, я не могу понять, какое событие это будет срабатывать. OnPreviewTextInput не запускается!

Любые идеи по захвату вложенных текстовых и обратных пространственных событий в WPF TextBox ?

Вот какой-то код, на котором я лежал, на случай, если мне это понадобится. Могу вам помочь.

 public Window1() { InitializeComponent(); // "tb" is a TextBox DataObject.AddPastingHandler(tb, OnPaste); } private void OnPaste(object sender, DataObjectPastingEventArgs e) { var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); if (!isText) return; var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; ... } 

Проблема с попыткой перехвата и блокировки всех отдельных событий, которые могут привести к изменению свойства TextBox.Text, заключается в том, что таких событий много:

  • TextInput: типы пользователей
  • KeyDown: Удалить, Backspace, Enter, IME
  • Жесты команд: Ctrl-X, Ctrl-Y, Ctrl-V, Ctrl-X
  • MouseDown: кнопка вставки, кнопка Cut, кнопка отмены, …
  • Нажмите: пробел, нажатый, когда кнопки «Вставить», «Отрезать», «Отменить» имеют локальный фокус
  • RaiseEvent: код вызывает команды Paste, Cut, Undo, Redo
  • Accessiblity: голосовые команды, клавиатура Брайля и т. Д.

Пытаться надежно перехватить все это – бесполезность. Гораздо лучшее решение – контролировать TextBox.TextChanged и отклонять изменения, которые вам не нравятся.

В этом ответе я покажу, как реализовать class TextBoxRestriction для заданного конкретного сценария. Эта же методика может быть обобщена для использования с любыми ограничениями, которые вы хотите разместить в элементе управления TextBox.

Например, в вашем случае вы можете реализовать свойство AttributeValidChars, аналогичное свойству RestrictDeleteTo в этом коде. Это будет одно и то же, за исключением того, что внутренний цикл проверяет вставки, а не удаляет. Он будет использоваться следующим образом:

  

Это всего лишь идея о том, как это можно обработать. Существует много способов структурирования вашего кода в зависимости от того, что вы хотите. Например, вы можете изменить TextBoxRestriction, чтобы вызвать свой собственный код для проверки с помощью присоединенного свойства, которое принимает делегат или объект, содержащий событие.

Дополнительную информацию о привязке свойства Text см. В другом ответе, когда вы используете class TextBoxRestriction, чтобы он не вызывал ограничение, когда вы этого не хотите.

Для backspace, пожалуйста, проверьте событие PreviewKeyDown

Для команды paste добавьте привязку команды к ApplicationCommands.Paste и установите аргумент для обработки, если вы не хотите ничего с ним делать:

    

И в коде позади:

 private void PasteExecuted(object sender, ExecutedRoutedEventArgs e) { e.Handled = true; } 

Вы можете добиться этого с PreviewKeyDown события TextChanged события TextChanged .

В PreviewKeyDown захватите операцию Вставить

 if(Key.V == e.Key && Keyboard.Modifiers == ModifierKeys.Control) { strPreviousString = this.txtNumber.Text; bIsPasteOperation = true; } 

В событии TextChanged

 if (true == bIsPasteOperation) { if (false == this.IsNumber(this.txtNumber.Text)) { this.txtNumber.Text = strPreviousString; e.Handled = true; } bIsPasteOperation = false; } 

Где метод IsNumber проверяет введенный текст Number или нет

 private bool IsNumber(string text) { int number; //Allowing only numbers if (!(int.TryParse(text, out number))) { return false; } return true } 
  • Как обеспечить, чтобы событие было подписано только один раз
  • Как передать событие методу?
  • В чем разница между Event Listeners & Handlers в Java?
  • Остановить распространение событий мыши в угловом
  • jQuery - событие триггера, когда элемент удален из DOM
  • Пользовательский прослушиватель событий Android
  • Android OnClickListener - идентифицировать кнопку
  • AddEventHandler с использованием отражения
  • Как разобрать JSON с Objective-C?
  • Планировщик событий MySQL в определенное время каждый день
  • Плохо ли не отменять регистрацию обработчиков событий?
  • Interesting Posts

    В C ++, что такое «псевдоним пространства имен»?

    Заполнение jTable с использованием данных базы данных

    RESTeasy и возврат на страницу JSP с моделью

    Отключить кнопки запуска webkit на тип ввода = «номер»?

    VT-x включен в BIOS, но отключен в Windows 7

    Как я могу освободить место на диске из папки установщика Windows, не убивая Windows?

    Grub2 не может загружать Windows 7 с ошибкой «недопустимая подпись»

    Android: реализация progressbar и «загрузка …» для бесконечного списка, например Android Market

    Android Studio: Gradle: ошибка: не удается найти символьную переменную

    SearchClick OnCloseListener не работает

    Манипуляция строкой запроса в Java

    Как я могу получить «сетевое» время (из параметра «Автоматический» под названием «Использовать сетевые значения»), а не время на телефоне?

    как изменить цвет заголовка Winform DataGridview?

    Как вызвать функцию-указатель-член?

    Как предотвратить возврат журнала из собственного состояния в начале каждого журнала?

    Давайте будем гением компьютера.