Вставить событие в текстовом поле WPF
Я создал настраиваемый элемент управления, наследующий TextBox
. Этот настраиваемый элемент управления представляет собой числовой TextBox
блок, поддерживающий только номера.
Я использую OnPreviewTextInput
чтобы проверить каждый новый символ, набираемый, чтобы увидеть, является ли символ допустимым. Это отлично работает. Однако, если я OnPreviewTextInput
текст в TextBox
, OnPreviewTextInput
не запускается.
Каков наилучший способ захватить вложенный текст в TextBox
?
- Microsoft Visual Studio и C #: как визуально добавлять события в элементы управления?
- Окончательный способ запуска событий нажатия клавиш с помощью jQuery
- Получение событий из базы данных
- Обработчики событий не являются streamобезопасными?
- C # передача дополнительных параметров обработчику событий?
Кроме того, у меня проблема при нажатии на обратное пространство, я не могу понять, какое событие это будет срабатывать. OnPreviewTextInput
не запускается!
Любые идеи по захвату вложенных текстовых и обратных пространственных событий в WPF TextBox
?
- Form_Load () 'event' или Override OnLoad ()
- Событие буфера обмена C #
- C #: Разница между '+ = anEvent' и '+ = new EventHandler (anEvent)'
- Каков правильный способ обработки событий на C ++?
- Как обрабатывать событие добавления в список?
- Создание пользовательского события в Java
- C #: создание унаследованного события
- Событие jQuery 'input'
Вот какой-то код, на котором я лежал, на случай, если мне это понадобится. Могу вам помочь.
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 }