帮助WPF TextCompositionManager事件

8 wpf events textinput textcompositionmanager

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

有三个事件的关注文本输入: 的TextInput,TextStartTextUpdate.每个事件有两个版本,一个是事件隧道(从窗口向下移动到具有焦点的控件)以及当它冒泡(从聚焦的UI元素向上移动到窗口)时:

隧道:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

冒泡:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

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


TL; DR

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

Joe*_*ite 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).如果您具有启用它注册表设置,则可能也适用于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中包含有用的信息.此事件意味着角色现在实际上正在"键入"(即,如果您在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 + 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上的标准路由(非附加)事件重新暴露的原因.