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