代码之家  ›  专栏  ›  技术社区  ›  Will

有关WPF TextCompositionManager事件的帮助

  •  8
  • Will  · 技术社区  · 15 年前

    这上面的医生很差劲。有许多事件可以连接到监视器并控制通过访问的文本输入。 文本合成管理器 . 如果你想做一些类似挂卡刷卡数据的事情,这就是你要做的。

    有三个事件与文本输入有关: 文本输入框 , 文本启动 文本日期 . 每个事件有两个版本,一个版本的事件 掘进 (从窗口向下移动到具有焦点的控件)以及 起泡 (从焦点UI元素向上移动到窗口):

    隧道掘进:

    • 预览文本输入事件
    • 预览文本输入开始事件
    • 预览文本输入更新事件

    冒泡:

    • 特克斯廷普特维尔
    • 文本输入开始事件
    • 文本输入更新事件

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


    DR

    我找不到这三个事件的确切定义。一个可接受的答案不仅将定义这三个事件(textinput、textinputstart和textinputupdate),而且将对它们进行比较和对比。不分享答案,请参考你的资料来源,维基百科是禁止分享的。你成绩的25%取决于这个。

    1 回复  |  直到 12 年前
        1
  •  17
  •   Joe White    15 年前

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

    • 标准键: 可打印字符,如“a”、“a”、“5”、“%”、退格符等。
    • 控制键: ctrl+c、ctrl+h、ctrl+m等。
    • 十进制键代码: 例如alt+numpad 2 5 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 我还没有证实这一点。(我设置了注册表设置,但没有立即生效;可能需要重新启动。)
    • 死键: 我知道多语言键盘有一些额外的东西叫做“死键”,可以修改下面的按键。例如,您可以按“umlaut”死键,然后按“o”,这将“键入”一个_(o和umlaut)。(我可能把细节搞错了。我一直在使用en-us键盘,我不知道使用死机键需要什么。)我怀疑它们的行为会类似于十进制键代码;见下文。
    • IMEs: 表意文字语言使用一种叫做“输入法编辑器”的东西。我对这些的了解比我对死钥匙的了解还要少,我不知道它们是否会引发这些事件。

    请注意,像shift和ctrl这样的修改键不会直接触发这些事件(与您看到按下shift、然后按下5等的键不同)。例如,shift+5,要获取“%”,只生成一个事件序列(即一个textinputstart和一个textinput),两个事件序列都接收字符串“%”。


    文本启动 每当您开始键入字符或字符代码时都会激发。当你按下一个标准键、一个控制键或一个十进制键代码的第一位时,它就会被触发。当这被触发时,系统有时(但并非总是)已经知道您按下的是什么键(就像在标准键和控制键的情况下)。如果它知道,它将在textcompositionEventArgs中告诉您;如果它不知道,textcompositionEventArgs是空的,根本不会告诉您任何信息。

    文本更新 在输入十进制键代码的第二位和后续数字时激发。对于这个事件,我只看到了一个空的textcompositionEventargs(尽管有可能它会随死键或IME而改变)。

    文本输入框 在您输入完密钥后被激发,并且系统确定您输入了什么密钥,因此它在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 5。只要你按下numpad 0,就会得到一个textinputstart事件,它告诉你没有任何有用的信息。对于每一个击键numpad 2、numpad 5和numpad 5,您都会得到一个textinputupdate事件,同样也没有有用的信息(到目前为止,您无法知道按下了哪些数字)。当您释放alt键(实际上是“键入”您输入的代码的键)时,您将得到textInput事件,以及您在e.text和e.textcomposition.text属性中输入的键。(这可能是不可打印的字符,例如,如果您输入了alt+numpad 0 8。)对于十进制键代码,键重复是不可能的。

    死键: 正如我上面提到的,我不知道如何测试这个。如果有人知道答案,请告诉我,我会把它包括在这里。

    IME: 再说一次,我不知道如何测试这个。


    我的印象是,在大多数情况下,textfinput是唯一一个有意义的事件(因为其他两个事件并不总是告诉你任何事情)。这可能就是为什么它是在uielement、uielement3d和contentelement上作为标准路由(非附加)事件公开的三个事件中唯一的一个。

    推荐文章