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



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



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



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



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



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

889   4  

4 ответов:

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

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;
    ...
}

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

  • TextInput: типы пользователей
  • KeyDown: удалить, Backspace, Enter, IME
  • Командная Жестов: Сочетание Клавиш Ctrl-Х, Сочетание Клавиш Ctrl-Г, Сочетание Клавиш Ctrl-V И Ctrl И-Х
  • событие mousedown: кнопка вставить, вырезать, отменить ...
  • нажмите: пробел нажата, когда вставить, вырезать, отменить кнопки имеют локальный фокус
  • RaiseEvent: код вызывает команды вставить, вырезать, отменить, повторить
  • доступность: голосовые команды, клавиатуры Брайля и т. д.

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

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

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

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

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

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

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

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

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

и в коде:

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

вы можете достичь этого с PreviewKeyDown событие и 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 метод проверяет введенный текст является числом или нет

private bool IsNumber(string text)
{
   int number;

   //Allowing only numbers
   if (!(int.TryParse(text, out number)))
   {
      return false;
   }
   return true
}

Comments

    Ничего не найдено.