8

这方面的文档非常粗制滥造。您可以挂钩许多事件来监视和控制通过TextCompositionManager访问的文本输入。如果你想做一些类似卡刷卡数据的事情,这就是你要做的地方。

涉及文本输入的三个事件: TextInputTextStartTextUpdate。每个事件有两个版本,一个是隧道式事件(从窗口向下移动到具有焦点的控件),一个是在冒泡时(从焦点 UI 元素向上移动到窗口):

隧道:

  • 预览文本输入事件
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

冒泡:

  • 文本输入事件
  • 文本输入启动事件
  • 文本输入更新事件

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


TL;博士

我找不到这三个事件的正确定义。一个可接受的答案不仅会定义三个事件(TextInput、TextInputStart 和 TextInputUpdate),还会对它们进行比较和对比。不共享答案,请参考您的来源,维基百科是禁区。你成绩的 25% 取决于此。

4

1 回答 1

19

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

  • 标准键: '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 上作为标准路由(非附加)事件重新公开的原因。

于 2009-06-27T19:03:41.540 回答