好的!我已经在这个问题上纠结了几天,进行了广泛的测试以理解并得出以下结论:
1- 键盘输入由页面事件(CharacterRecieved
)处理。事件被触发并被页面捕获,然后发送到TextBox
,最终导致TextChanged
事件的触发。
2- 如果您以winForms的思维方式来处理winRT和Windows Phone,那么您肯定会像我一样感到困惑,并需要一些时间来弄清楚它 [除非您阅读了这个答案,这将缩短时间]。
3- 不要期望(就像我错误地期望的那样)输入字符的事件将在TextBox
上触发。它将在页面(CoreWindow)上触发,然后更改textBox
的文本值,因此您必须在页面级别而不是控件级别上捕获事件。
4- 通过键盘输入一个字母和使用滑动输入法输入一个单词之间的区别:
**
- 在手机键盘上输入一个字母的情况下,最可能会发生以下序列:
**
假设textBox.Text =“99”;
现在我要按数字7:
1- 触发KeyDown
事件:在这里,您可以捕获virtualKey
,但无法知道字符,因此按下字母'a'时,您无法知道它是'A'大写还是'a'小写。
仍然是textBox.Text =“99”;
2- 触发CharacterRecieved
事件;textBox.Text =“997”;
3- 触发KeyUp
事件;textBox.Text =“997”;
4- 触发textChanged
事件;textBox.Text =“997”;
假设textBox.Text =“99”;
我想输入文本“hello”;
滑动输入法将在单词前添加空格,因此它将变为“ hello”
事件序列如下:
1- 对于字符串“ hello”中的每个字符,都会触发事件CharacterRecieved
,并且在第一次迭代中,textBox.Text
值将为textBox.Text=“99 ”
; 然后从第二次迭代开始,textBox.Text =“99 hello”;
在每次迭代中,您都可以捕获key code [char]
,在这种情况下为(32, 110, 101, 108, 108, 111)。请注意,到目前为止,textBox.Text
的值已更改,但尚未显示在屏幕上!!
2-textChanged
事件会触发两次(很奇怪!我认为一次是因为空格,第二次是因为单词“hello”),此外,现在textBox.Text = "99 hello"
但仍未显示在屏幕上,直到两次迭代结束后才会显示。
由此我们注意到了Swype和普通键盘按键事件之间的差异,其中Swype根本没有keyDown
keyUp
事件!!
现在,如果您知道每种键盘输入方法(Swype /非Swype)的情况,您可以根据自己的意愿规划验证和应用程序行为。只要您知道它与传统的Windows系统输入完全不同。
我希望这能帮助某个人,并节省他/她许多困惑和痛苦 :)