Имитация нажатия клавиш в WPF - PullRequest
3 голосов
/ 27 февраля 2012

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

// 'key' is set beforehand
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, Environment.TickCount, key) { RoutedEvent = Control.KeyDownEvent });

Он вызывается в обработчике событий Button.Click.

Пока работает только Key.Back.Ни одна из цифровых клавиш не работает, и ни одна не работает Key.Decimal.

РЕДАКТИРОВАТЬ: я думал, что использование SendKeys решит проблему, но это просто делает то же самое.

Почему нет?т мои цифровые кнопки работают?Я подтвердил, что передается правильный Key.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

После наших обсуждений в комментариях я предлагаю вам рассмотреть такой подход.Я не знаю полного требования, но разделение функциональности и создание приложения менее монолитным - это всегда хороший подход!

Во-первых, псевдо-UML-диаграмма будет такой:

Class depedendency diagram

Ваши три функции будут реализованы следующим образом (псевдокод):

UserControl1.InsertCharacter(string character)
{
    textBox1.Text = textBox1.Text.Insert(textBox1.CaretIndex, character); 
    this.ValidateInput();
}

UserControl1.ValidateInput()
{
    // Perform validation
}

UserControl1.OnKeyDown()
{
    // Perform validation
    this.ValidateInput();
}

UserControl2.AppendCharacter(string clickedCharacter)
{
    this.userControl1.InsertCharacter(clickedCharacter); 
}

Чтобы дополнительно отделить UserControl2 от UserControl1, как я уже говорил, вы можете использовать шаблоны событий, такие как события .NETEventAggregator.

0 голосов
/ 27 февраля 2012

Посмотрите на http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b657618e-7fc6-4e6b-9b62-1ffca25d186b/. В текстовом поле WPF есть проблемы с обработкой определенных ключей.

Из статьи:

var eventArgs = new TextCompositionEventArgs(Keyboard.PrimaryDevice, 
new TextComposition(InputManager.Current, Keyboard.FocusedElement, key));  
eventArgs.RoutedEvent = TextInputEvent;  

InputManager.Current.ProcessInput(eventArgs); 
...