2012-02-27 137 views
3

我正在开发WPF触摸应用程序的屏幕上的数字键盘。这将出现在Popup中。当按下按钮时,它应该向应用程序发送按键,使其看起来好像用户正在输入TextBox。这是我的代码:在WPF中模拟按键

// '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正在通过。

+1

数字键盘上的按键可能与顶部行有不同的键。这是一个未经测试的评论 - 不是答案。 – Paparazzi 2012-02-27 17:21:59

+0

@BalamBalam:顶部行和数字键都不能与代码一起使用。两者都在物理键盘上工作。 – 2012-02-27 17:27:16

+0

这听起来像是一种迂回的实现方式。你能不能在第三方助手类中实现所有的按键功能,并获得弹出键盘或键盘输入? – 2012-02-27 17:31:57

回答

0

继我们在意见的讨论,我建议你考虑这样的方法。我不知道完整的要求,但将功能分开并使应用程序更加单一,总是一个好方法!

首先是,伪UML图将是这样:

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

要从的UserControl1进一步解耦UserControl2:

Class depedendency diagram

你的三个功能将如下(伪代码)来实现正如我所提到的,您可以使用事件模式,如.NET事件或EventAggregator。

+0

感谢您的好解答。我仍然在寻找一种简单按下按键的方法,但如果找不到,我会接受。 – 2012-02-27 21:04:37

+2

我确定有一个,我会研究UIAutomation框架,因为这可以模拟鼠标/键输入(主要用于自动化测试)。然而,我试图提出的一点是,如果可能的话,它很好地避免这种情况,并将逻辑从视图交互中移出,并转移到代码隐藏中的特定函数中,或者更好地移入MVVM应用程序中的ViewModels中 – 2012-02-27 21:09:50

0

看看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); 
+0

'TextComposition'构造函数期望为最后一个参数提供一个字符串,而不是'Key' – 2012-02-27 18:43:00