好的!我已经研究这个问题好几天了,并对其进行了广泛的测试以理解并得出以下结论:
1- 来自键盘的输入由名为 (CharacterRecieved) 的页面事件处理。该事件被 Page 触发并捕获,然后发送到 TextBox 并导致触发 TextChanged 事件。
2- 如果您带着 winForms 的心态来使用 winRT 和 windows phone,您肯定会遇到我的困惑,并且需要一些时间来弄清楚 [除非您阅读了这个答案,这会使其更短]。
3- 不要期望 [正如我错误地预期的那样] 输入的字符的事件将在 TextBox 中触发。它将在页面(CoreWindow)上触发,然后更改文本框的文本值,因此您必须在页面级别而不是控件级别捕获事件。
4- 键盘输入一个字母和swype键盘输入一个单词的区别:
**
- 在手机键盘输入一个字母的情况下,
以下顺序很可能会发生:
**
假设textBox.Text = "99";
现在我按数字 7:
1- KeyDown 事件将触发:在这里您可以捕获 virtualKey 但您将无法知道该字符,因此按“a”字母您无法知道它是“A”大写还是'一个小的。
还是textBox.Text = "99";
2-CharacterRecieved火; textBox.Text = "997";
3- KeyUp 事件触发; textBox.Text = "997";
4-textChanged火。 textBox.Text = "997";
假设textBox.Text = "99";
我想输入文本“你好”;
swype 会在单词前添加空格,所以它会是“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" 但尚未显示在屏幕直到 textChanged 事件的两次迭代结束。
由此我们开始注意到 swype 和普通键盘按键事件之间的区别,即在 swype 中根本没有 keyDown keyUp 事件!!
现在,如果您了解每种键盘输入方法(swype/non-swype)的场景,您可以根据需要规划您的验证和应用程序行为。前提是您知道它与旧版 Windows 系统输入完全不同。
我希望这将帮助那里的人,并为他/她节省数小时的困惑和痛苦:)