【问题标题】:Simulating Key Presses in WPF在 WPF 中模拟按键
【发布时间】:2012-02-27 17:06:54
【问题描述】:

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

【问题讨论】:

  • 数字键盘上的键可能与顶行不同。这是未经测试的评论 - 不是答案。
  • @BalamBalam:顶行和小键盘键都不能与代码一起使用。两者都可以在物理键盘上使用。
  • 这听起来像是实现某事的迂回方式。您不能在第三方帮助类中实现所有按键功能并同时获取弹出键盘或键盘输入吗?
  • @Dr.AndrewBurnett-Thompson:我没有特殊的密钥处理。只是一个TextBox
  • 好的,为什么不在弹出键上单击“TextBox.Text += newKeyCharacter”?如果弹出控件没有底层控件的引用来设置文本,则使用事件模式(如 .NET 事件或 EventAggregator)将数据从弹出控件获取到文本框

标签: c# .net wpf input touch


【解决方案1】:

根据我们在 cmets 中的讨论,我建议您考虑采用这样的方法。我不知道完整的要求,但拆分功能并减少应用程序的单一性始终是一个好方法!

首先,一个伪 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); 
}

如我所述,要进一步将 UserControl2 与 UserControl1 分离,您可以使用事件模式,例如 .NET 事件或 EventAggregator。

【讨论】:

  • 感谢您的好回答。我仍在寻找一种只需按一个键的方法,但如果我找不到,我会接受这个。
  • 我确定有一个,我会研究 UIAutomation 框架,因为它可以模拟鼠标/键输入(主要用于自动化测试)。但是,我要说明的一点是,如果可能的话,最好避免这种情况,并将逻辑从视图交互中移到代码隐藏中的特定函数中,或者更好的是,移到 MVVM 应用程序中的 ViewModel 中
【解决方案2】:

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

【讨论】:

  • TextComposition 构造函数需要一个字符串作为最后一个参数,而不是 Key
  • key 变量应替换为所需的密钥,例如Key.Tab 为制表键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2021-03-07
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2012-01-30
相关资源
最近更新 更多