在WPF中模拟按键操作

4

我正在为一款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


1
数字键盘上的按键可能与顶部行的按键不同。这是一个未经测试的评论 - 不是答案。 - paparazzo
@BalamBalam:代码无法使用顶部行或数字键。但是物理键盘上两者都可以正常工作。 - Kendall Frey
这听起来像是一种绕路的方式来实现某些功能。你为什么不在第三方帮助类中实现所有按键功能,并让弹出键盘或键盘输入到该类中呢? - Dr. Andrew Burnett-Thompson
@Dr.AndrewBurnett-Thompson:我没有特殊的按键处理。只有一个“文本框”。 - Kendall Frey
为什么不在弹出键点击事件中加入 "TextBox.Text += newKeyCharacter" 代码呢?如果弹出控件没有引用底层控件来设置文本,那么可以使用诸如 .NET 事件或 EventAggregator 的事件模式从弹出控件获取数据到文本框。 - Dr. Andrew Burnett-Thompson
显示剩余6条评论
2个回答

1
根据我们在评论中的讨论,我建议您考虑像这样的方法。我不知道完整的要求,但将功能分割并使应用程序更少地成为单一体育是一个好方法!
首先,伪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,您可以使用事件模式,例如.NET事件或EventAggregator。


谢谢你的好回答。我仍在寻找一种简单按键的方法,但如果找不到,我会接受这个方案。 - Kendall Frey
2
我相信有这样的框架,你可以研究一下UIAutomation框架,因为它可以模拟鼠标/键盘输入(主要用于自动化测试)。然而,我想说的是,如果可能的话,最好避免这种情况,并将逻辑从视图交互中移出,并放入代码后台的特定函数中,或者更好的是,在MVVM应用程序中放入ViewModels中。 - Dr. Andrew Burnett-Thompson

0

TextComposition 构造函数的最后一个参数应该是字符串,而不是 Key - Kendall Frey
关键变量应该被替换为所需的关键字,例如Key.Tab表示制表键。 - stuicidle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接