8 wpf events textinput textcompositionmanager
这方面的文档非常粗制滥造.您可以连接许多事件来监视和控制通过TextCompositionManager访问的文本输入.如果您想要做一些像snag卡刷卡数据这样的事情,那就是你要做的事情.
有三个事件的关注文本输入: 的TextInput,TextStart和TextUpdate.每个事件有两个版本,一个是事件隧道(从窗口向下移动到具有焦点的控件)以及当它冒泡(从聚焦的UI元素向上移动到窗口)时:
隧道:
冒泡:
因此,根据您在TextCompositionManager中挂钩的逻辑树中的位置,您可以在它们到达事件焦点之前修改这些文本事件,或者之后只查看它们.所有这些在文档和使用中都非常简单明了.
TL; DR
我找不到这三个事件的合理定义.可接受的答案不仅会定义三个事件(TextInput,TextInputStart和TextInputUpdate),还会比较和对比它们.没有分享答案,请参考您的来源和维基百科是不受限制的.你的成绩的25%取决于此.
Joe*_*ite 17
它们之间的差异取决于您输入的字符类型.
请注意,像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上的标准路由(非附加)事件重新暴露的原因.