TextCompositionManager中有六个附加事件:
- PreviewTextInputStartEvent
- TextInputStartEvent
- PreviewTextInputUpdateEvent
- TextInputUpdateEvent
- PreviewTextInputEvent
- TextInputEvent
我写了一个只包含一个TextBox和相关事件处理器的Demo测试了这六个事件发生的时机
当通过键盘,输入普通的字符时会依次调用:TextBox_PreviewTextInputStartTextBox_TextInputStartTextBox_PreviewTextInput且在这三个方法中,TextBox的Text属性内容为输入之前的。 在e.TextComposition.Text内包含输入的字符。TextInput事件不会发生,已经被TextBox内部处理。 当通过输入法或Alt+小键盘输入字符时,会依次调用:TextBox_PreviewTextInputStart TextBox_TextInputStartTextBox_PreviewTextInputUpdateTextBox_TextInputUpdateTextBox_PreviewTextInput相比直接输入,多调用了TextBox_PreviewTextInputUpdate和TextBox_TextInputUpdate。 通过Alt+小键盘输入时,每按小键盘一次会相应调用一次TextBox_PreviewTextInputUpdate和TextBox_TextInputUpdate。 当通过输入法输入时,会在TextBox_PreviewTextInputUpdate和TextBox_TextInputUpdate中的e.TextComposition.CompositionText包含输入的字符,Alt+小键盘不包含。即使通过反射强行修改该属性,并不会影响用户输入。如果需要修改输入,可以将该事件标为已处理,然后通过TextCompositionManager.StartComposition(new TextComposition(InputManager.Current, TextBox, ""))重新模拟输入。 只有TextBox_PreviewTextInput的e.TextComposition.Text内包含输入的字符,其他方法均不包含。