帮助WPF TextCompositionManager事件

时间:2009-06-27 17:06:45

标签: wpf events textinput textcompositionmanager

关于此的文档非常粗制滥造。您可以使用许多事件来监视和控制通过 TextCompositionManager 访问的文本输入。如果您想要做一些像snag卡刷卡数据这样的事情,这就是你要做的事情。

有三个与文本输入有关的事件: TextInput TextStart TextUpdate 。每个事件有两个版本,一个是事件是隧道(从窗口向下移动到具有焦点的控件),当它是冒泡时(从将焦点的UI元素添加到窗口中:

隧道

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

鼓泡:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

因此,根据您在TextCompositionManager中挂钩的逻辑树中的位置,您可以在它们到达事件焦点之前修改这些文本事件,或者之后只查看它们。所有这些在文档和使用中都非常简单明了。


TL; DR

我无法找到这三个事件的合理定义。可接受的答案不仅会定义三个事件(TextInput,TextInputStart和TextInputUpdate),还会比较和对比它们。没有分享答案,请参考您的来源和维基百科是不受限制的。你的成绩的25%取决于此。

1 个答案:

答案 0 :(得分:17)

它们之间的差异取决于您输入的字符类型。

  • 标准密钥:可打印字符,如“a”,“A”,“5”,“%”,退格等。
  • 控制键: Ctrl + C,Ctrl + H,Ctrl + M等
  • 十进制密钥代码:类似Alt + numpad 2 5 5(对于IBM扩展ASCII代码255,即Unicode不间断空间U + 00A0)和Alt + numpad 0 2 5 5(对于Windows ANSI代码255,即Unicode U + 00FF)。如果你有Registry setting to enable it,也可能适用于Alt + numpad加2 6 3 B(对于U + 263B);我还没有证实这一点。 (我设置了注册表设置但它没有立即生效;可能需要重新启动。)
  • 死键:我知道多语言键盘有额外的东西叫做“死键”,可以修改下面的按键。例如,您可以按下“变音符号”死键,然后按“o”,这将“键入”ö(带有变音符号的o)。 (我可能有错误的细节。我一直使用en-US键盘,我不知道如何使用死键。)我怀疑这些行为与十进制密钥代码类似;见下文。
  • IME:表意语言使用称为“输入法编辑器”的东西。我对死锁的了解甚少,我知道他们是否会解雇这些事件。

请注意,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上作为标准路由(非附加)事件重新暴露的原因。