Текстовое поле WPF RaiseEvent

У меня есть код проверки, который использует маскирование и события PreviewTextInput и PreviewKeyDown в текстовом поле. Когда я изменяю значение в текстовом поле вручную, проверка работает отлично. Когда я устанавливаю значения программно, проверка не начинается до тех пор, пока я не щелкну в поле, не удалю символ и не добавлю его повторно, вручную запустив одно или оба из вышеуказанных событий.

Есть ли способ запустить любое из этих событий вручную, чтобы проверка работала?

Я пробовал такие вещи, как:

this.TextBox.RaiseEvent(this.TextBox.PreviewTextInput);

Но ничего не работает. Я тоже не могу совместить типы. Любые идеи приветствуются.

Используемый мной код проверки на основе маскирования можно увидеть здесь: Как определить ограничения ввода TextBox?


person Nathan Tornquist    schedule 31.05.2012    source источник
comment
Я не уверен, чего вы пытаетесь достичь, но вы можете изменить режим привязки текста на UpdateSourceTrigger=Explicit. Таким образом, вы можете точно сказать WPF, когда обновлять источник, который должен также обновлять проверку. Но почему бы вам не использовать встроенную проверку?   -  person dowhilefor    schedule 31.05.2012
comment
Я не думаю, что подделка события текстового поля - правильный способ решить проблему здесь.   -  person Terry    schedule 31.05.2012
comment
Я думаю, что да, если у вас нет другого предложения. Я не использую реальную проверку. Я использую маскировку. Мой код находится здесь: stackoverflow .com/questions/1103765/   -  person Nathan Tornquist    schedule 31.05.2012


Ответы (3)


Чтобы завершить ответ Тревора Эллиотта, мне пришлось повторно использовать ту же ссылку TextCompositionEventArgs, чтобы заставить ее работать:

    TextCompositionEventArgs eventArgs =
      new TextCompositionEventArgs(
        InputManager
          .Current
          .PrimaryKeyboardDevice,
        new TextComposition(
          InputManager.Current, 
          target, 
          ((char) KeyInterop.VirtualKeyFromKey(KBB.Key)).ToString()));

    eventArgs.RoutedEvent = TextCompositionManager.PreviewTextInputStartEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.TextInputStartEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.PreviewTextInputEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.TextInputEvent;
    target.RaiseEvent(eventArgs);

Надеюсь это поможет

person Axel Samyn    schedule 04.11.2019

Вы можете использовать следующий код для имитации ввода текста в TextBox.

TextCompositionEventArgs args = new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, txtBox, "Test text")
);
args.RoutedEvent = TextCompositionManager.PreviewTextInputEvent;

txtBox.RaiseEvent(args);

args = new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, txtBox, "Test text")
);
args.RoutedEvent = TextCompositionManager.TextInputEvent;

txtBox.RaiseEvent(args);
person Trevor Elliott    schedule 31.05.2012
comment
Это работает, но по какой-то причине настроенная мной проверка всегда возвращает false, пока вы вручную не измените значение. - person Nathan Tornquist; 31.05.2012

Или вы можете просто выбрать текст в текстовом поле после ввода текста с помощью кода, например, t.Select().

Таким образом, как только пользователь переместит фокус с текстового поля, сработает проверка.

person Stephen Avery    schedule 14.01.2013