【问题标题】:Help with the WPF TextCompositionManager events帮助 WPF TextCompositionManager 事件
【发布时间】:2010-11-06 09:29:39
【问题描述】:

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

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

隧道:

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

冒泡:

  • 文本输入事件
  • TextInputStartEvent
  • TextInputUpdateEvent

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


TL;DR

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

【问题讨论】:

    标签: wpf events textinput textcompositionmanager


    【解决方案1】:

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

    • 标准键: 可打印字符,如“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 上作为标准路由(非附加)事件重新公开的原因。

    【讨论】:

    • 哇,这是一个了不起的答案。你以优异的成绩毕业。我将您的回答标记为满意,但请查看以下相关问题,您可能会帮助我解决问题:stackoverflow.com/questions/1053533/…
    • 我已经尝试了死键的预览事件。当我按下~ 时,我会收到带有Text=~PreviewTextInputStart 事件。然后,当我按下a 时,我得到一个PreviewTextInputUpdate,然后是一个PreviewTextInputText=ã。对于TextInput 事件,我得到了类似的结果,但从未调用过TextInput 事件。事实上,即使是简单的键(例如a),我也从未收到TextInput 事件
    • 这至少发生在文本框上。以下是事件的顺序和对应的Text 属性:gist.github.com/luiscubal/9691303
    • 对于画布,TextInput 事件正常触发:gist.github.com/luiscubal/9691364 另请注意,可以在没有中间事件的情况下键入ã。如果您在应用程序未获得焦点时按~,然后聚焦应用程序窗口并按a 键,则仍键入ã,即使应用程序没有“看到”~ 键事件。
    • 标准键:一旦你按下这个键,你会立即得到一个 TextInputStart,然后是一个 TextInput。 不正确,例如空白 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多