它们之间的差异取决于您输入的字符类型。
- 标准键: 'a'、'A'、'5'、'%'、Backspace 等可打印字符。
- 控制键: 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 plus 2 6 3 B(对于 U+263B) ;我还没有证实这一点。(我设置了注册表设置,但没有立即生效;可能需要重新启动。)
- 死键:我知道多语言键盘有额外的东西,称为“死键”,可以修改以下击键。例如,您可以按“变音符号”死键,然后按“o”,这将“键入”一个 ö(带有变音符号的 o)。(我的细节可能有误。我一直使用美式键盘,但我不知道如何使用死键。)我怀疑它们的行为类似于十进制键码;见下文。
- IME:表意语言使用一种叫做“输入法编辑器”的东西。我对这些的了解甚至比对死键的了解还要少,而且我不知道它们是否会触发这些事件。
请注意,像 Shift 和 Ctrl 这样的修饰键不会直接触发这些事件(与 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 事件,它告诉您绝对没有任何用处。对于小键盘 2、小键盘 5 和小键盘 5 中的每一个击键,您都会收到一个 TextInputUpdate 事件,但同样没有任何有用的信息(您无法分辨到目前为止按下了哪些数字)。当您释放 Alt 键(实际上是“键入”您输入其代码的键)时,您将获得 TextInput 事件,其中包含您在 e.Text 和 e.TextComposition.Text 属性中输入的键。(这可能是一个不可打印的字符,例如,如果您输入了 Alt+numpad 0 8。)十进制键代码不能重复键。
死键:正如我上面提到的,我不知道如何测试这个。如果有人有答案,请告诉我,我会在此处附上。
IME:再说一次,我不知道如何测试这个。
我的印象是,对于大多数用途,TextInput 是唯一一个有意义的事件(因为其他两个并不总是告诉你任何事情)。这可能就是为什么它是三个中唯一一个在 UIElement、UIElement3D 和 ContentElement 上作为标准路由(非附加)事件重新公开的原因。