关于这个的文档很伪劣。您可以关联许多事件来监视和控制通过 TextCompositionManager 访问的文本输入。如果您想执行诸如“障碍卡刷卡数据”之类的操作,请在此处进行操作。
存在与文本输入有关的三个事件:TextInput,TextStart和TextUpdate。每个事件有两种版本,一种是事件进行隧道传输(从Window向下移动到具有焦点的控件),另一种是冒泡事件(从聚焦的UI元素向上移动到窗口):
隧道:
起泡:
因此,根据您挂接到TextCompositionManager的逻辑树中的哪个位置,您可以在这些文本事件到达事件焦点之前对其进行修改,或者在之后对其进行查看。所有这些在文档中和使用中都非常简单明了。
TL; DR
我找不到这三个事件的恰当定义。可接受的答案不仅将定义三个事件(TextInput,TextInputStart和TextInputUpdate),而且还将对它们进行比较和对比。没有共享答案,请引用您的消息来源,维基百科是禁止访问的。您的成绩的25%取决于此。
最佳答案
它们之间的差异取决于您键入的字符类型。
请注意,Shift和Ctrl等修饰键不会直接触发这些事件(与KeyDown不同,在KeyDown中您会看到按下Shift,然后按下了5,等等)。例如,要获取“%”,请按Shift + 5,仅生成一个事件序列(即,一个TextInputStart和一个TextInput),并且都接收字符串“%”。
每当您开始输入字符或字符代码时,就会触发 TextInputStart 。当您按下标准键,控制键或十进制键代码的第一位时,将触发该事件。启用此功能后,系统有时(但并非总是)已经知道您要按下的键(例如标准键和控制键)。如果知道,它将在TextCompositionEventArgs中告诉您;如果不知道,则TextCompositionEventArgs为空,什么也不会告诉您。
当您输入十进制键码的第二位和后续数字时,将触发TextInputUpdate 。除了该事件为空的TextCompositionEventArgs之外,我什么都没有看到(尽管有可能随着死键或IME的改变而改变)。
输入 key 后,将触发 TextInput ,并且系统会确定您输入的 key ,因此在TextCompositionEventArgs中始终具有有用的信息。此事件表示现在实际上正在“键入”字符(即,它对应于您在TextBox中键入字符的时间)。
因此,这是事件序列适用于不同类型字符的方式:
标准键:按下该键后,将立即得到一个TextInputStart,然后是一个TextInput。两者在TextCompositionEventArgs中具有相同的内容:e.Text和e.TextComposition.Text都设置为您按下的键。 (请注意,这并不总是可打印字符。如果按Backspace键,它将出现在e.Text中。)如果按住该键,则每次重复键都会得到一对事件(TextInputStart/TextInput)。
控制键:按下字母键后,将立即得到一个TextInputStart,然后是一个TextInput。两者在其TextCompositionEventArgs中具有相同的内容:e.ControlText和e.TextComposition.ControlText都设置为您按下的控制键。如果按住字母键,则每次重复键都会获得一对事件(TextInputStart/TextInput)。
十进制键代码:假设您要键入Alt +数字键盘0 2 5 5.按下数字键盘0时,您将获得TextInputStart事件,该事件告诉您绝对没有用。对于每个键numpad 2,numpad 5和numpad 5,您都会得到一个TextInputUpdate事件,但又没有有用的信息(您无法分辨到目前为止已按下的数字)。释放Alt键(实际上是“键入”您输入代码的键)时,您将获得TextInput事件,以及在e.Text和e.TextComposition.Text属性中输入的键。 (这可能是不可打印的字符,例如,如果您输入了Alt +数字键盘08。)十进制键代码无法进行键重复。
死键:如上所述,我不知道如何进行测试。如果有人有答案,请告诉我,我将在此包括在内。
IME:同样,我不知道如何测试。
我的印象是,对于大多数用途而言,TextInput是这些事件中唯一有意义的事件之一(因为其他两个事件并不总是告诉您任何事情)。这可能就是为什么它是在UIElement,UIElement3D和ContentElement上作为标准路由(非附加)事件重新公开的三个对象中唯一一个的原因。
关于wpf - WPF TextCompositionManager事件的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053210/