Событие вставки в WPF TextBox

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

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

Что лучший способ состоит в том, чтобы получить вставленный текст в a TextBox?

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

Любые идеи, как получить вставленный текст и спину, располагают события с интервалами в WPF TextBox?

61
задан Arcturus 11 January 2019 в 07:07
поделиться

3 ответа

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

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;
    ...
}
123
ответ дан 24 November 2019 в 17:08
поделиться

Для backspace проверьте событие PreviewKeyDown

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

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Paste"
                  Executed="PasteExecuted" />
</Window.CommandBindings>

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

private void PasteExecuted(object sender, ExecutedRoutedEventArgs e)
{
    e.Handled = true;
}
7
ответ дан 24 November 2019 в 17:08
поделиться

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

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

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

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

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

<TextBox my:TextBoxRestriction.RestrictValidChars="0123456789" />

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

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

14
ответ дан 24 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: