关于此的文档非常粗制滥造。您可以使用许多事件来监视和控制通过 TextCompositionManager 访问的文本输入。如果您想要做一些像snag卡刷卡数据这样的事情,这就是你要做的事情。
有三个与文本输入有关的事件: TextInput , TextStart 和 TextUpdate 。每个事件有两个版本,一个是事件是隧道(从窗口向下移动到具有焦点的控件),当它是冒泡时(从将焦点的UI元素添加到窗口中:
隧道
鼓泡:
因此,根据您在TextCompositionManager中挂钩的逻辑树中的位置,您可以在它们到达事件焦点之前修改这些文本事件,或者之后只查看它们。所有这些在文档和使用中都非常简单明了。
TL; DR
我无法找到这三个事件的合理定义。可接受的答案不仅会定义三个事件(TextInput,TextInputStart和TextInputUpdate),还会比较和对比它们。没有分享答案,请参考您的来源和维基百科是不受限制的。你的成绩的25%取决于此。
答案 0 :(得分:17)
它们之间的差异取决于您输入的字符类型。
请注意,Shift和Ctrl等修饰键不会直接触发这些事件(与KeyDown不同,在KeyDown中,您会看到按下Shift键,然后按下5键等)。例如,Shift + 5,得到“%”,只生成一个事件序列(即一个TextInputStart和一个TextInput),两者都接收字符串“%”。
TextInputStart 。按下标准键,控制键或十进制键代码的第一个数字时会触发它。当这被触发时,系统有时(但不总是)已经知道你按下了什么键(如标准键和控制键的情况)。如果它知道,它将在TextCompositionEventArgs中告诉你;如果它不知道,TextCompositionEventArgs为空并且根本不会告诉你任何内容。
输入十进制密钥代码的第二个及后续数字时会触发TextInputUpdate 。我还没有看到任何事情,只有一个空的TextCompositionEventArgs用于此事件(尽管它可能会随着死键或IME而改变)。
输入密钥后会触发TextInput ,并且系统确定您输入了什么密钥,因此它始终在TextCompositionEventArgs中包含有用的信息。此事件意味着角色现在实际上正在“键入”(即,如果您在文本框中键入字符,则对应于角色出现的时间)。
所以这里是事件序列如何适用于不同类型的角色:
标准密钥:只要按下该键,就会立即得到一个TextInputStart,然后是TextInput。两者在TextCompositionEventArgs中具有相同的内容:e.Text和e.TextComposition.Text都设置为您按下的键。 (请注意,这并不总是可打印的字符。如果按Backspace,则它位于e.Text中。)如果按住该键,则会获得每个键重复的事件对(TextInputStart / TextInput)。
控制键:只要按下字母键,就会立即得到一个TextInputStart,然后是TextInput。两者在TextCompositionEventArgs中具有相同的内容:e.ControlText和e.TextComposition.ControlText都设置为您按下的控制键。如果按住字母键,您将获得每个键重复的事件对(TextInputStart / TextInput)。
十进制键代码:假设您正在键入Alt + numpad 0 2 5 5.只要按下numpad 0,就会得到一个TextInputStart事件,它告诉您绝对没有用处。对于每个键击numpad 2,numpad 5和numpad 5,你得到一个TextInputUpdate事件,同样没有有用的信息(你不能告诉到目前为止已按下了什么数字)。当您释放Alt键(实际上“键入”您输入其代码的键)时,您将获得TextInput事件,其中包含您在e.Text和e.TextComposition.Text属性中输入的键。 (这可能是一个不可打印的字符,例如,如果您输入Alt + numpad 0 8.)十进制密钥代码不能进行密钥重复。
死键:正如我上面提到的,我不知道如何测试它。如果有人有答案,请告诉我,我会把它包括在内。
IME:再次,我不知道如何测试它。
我的印象是,对于大多数用途,TextInput是这些事件中唯一有意义的使用(因为其他两个并不总是告诉你任何事情)。这可能就是为什么它是三个中唯一一个在UIElement,UIElement3D和ContentElement上作为标准路由(非附加)事件重新暴露的原因。