Update [16-Jul-2014]: The question is technically incorrect. Read the answer to get more details.
I was trying to capture text before reaching to my text box. and I discovered the following facts:
KeyDown
,KeyUp
event will tell you whatvirtualKey
was pressed not the character !!CoreWindow.CharacterReceived
will capture the character but this
event is not specific to TextBox and it will tell you the character
after it reached to the textBox.
Now my question is:
Can any one tell me how can I capture the event of the Swype Keyboard on windows phone 8.1?
Notice that :
1- I tried to capture it in TextBox.Paste but it fails :(
2- The event textBox.textChanged()
is not what I am looking for bec that event fire after the keyboard is done and this event (textChanged) will fire after keyDown
, keyUp
, CharacterReceived
regardless of how the text was input.
OK! I have been in this issue for days and extensively tested it to understand and came up with the following conclusions:
1- the input from keyboard is handled by the event of the page named (
CharacterRecieved
). the event is fired and captured by the Page then sent to theTextBox
and will result in the firing ofTextChanged
event.2- If you come to winRT and windows phone with the winForms mentality you will surely have the confusion i had, and will take some time to figure it out [unless you read this answer which will make it shorter].
3- Don't expect [ as I falsely expected ] that the event of the character entered will fire in the TextBox. It will fire on the page (CoreWindow) then changes the text value of the textBox, so you have to catch the event on the page level, not on the control level.
4- Difference between entering one letter by keyboard and entering one word using swype keyboard:
**
**
suppose the
textBox.Text = "99";
Now I will press the number 7:
1-
KeyDown
event will fire: here you may capture thevirtualKey
but you won't be able to know the character, so pressing 'a' letter you can't know is it 'A' capital or 'a' small. stilltextBox.Text = "99";
2-
CharacterRecieved
Fire;textBox.Text = "997";
3-
KeyUp
event fire;textBox.Text = "997";
4-
textChanged
fire.;textBox.Text = "997";
suppose
textBox.Text = "99";
and I want to enter the text "hello";swype will add white space before the word so it will be " hello"
and the event sequence is as follow:
1- a loop for each character in the string " hello" will fire the event
CharacterRecieved
and thetextBox.Text
value will betextBox.Text= "99 "
in the first iteration; then from the second iteration thetextBox.Text = "99 hello";
in each iteration you can capture thekey code [char]
which is in this case (32, 110, 101, 108,108, 111). notice that by now thetextBox.Text
value is changed however not yet shown on the screen !!2- The
textChanged
event will fire twice (weird !! i think one for the white space and the second for the word "hello"), Also, by now thetextBox.Text = "99 hello"
but still not yet shown on the screen till the end of the two iterations over the textChanged event.With this we come to notice the difference between swype and normal keyboard key events which is that in swype there is no
keyDown
keyUp
events at all !!Now if you know the scenarios with each method of keyboard input ( swype/non-swype) you can plan your validation and application behaviour as you wish. provided that you know it is totally different than the legacy windows system input.
I hope this will help someone there and save him/her many hours of confusion and agony :)