wpf - WPF TextCompositionManager事件的帮助

标签 wpf events textinput textcompositionmanager

关于这个的文档很伪劣。您可以关联许多事件来监视和控制通过 TextCompositionManager 访问的文本输入。如果您想执行诸如“障碍卡刷卡数据”之类的操作,请在此处进行操作。

存在与文本输入有关的三个事件:TextInput,TextStart和TextUpdate。每个事件有两种版本,一种是事件进行隧道传输(从Window向下移动到具有焦点的控件),另一种是冒泡事件(从聚焦的UI元素向上移动到窗口):

隧道:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

  • 起泡:
  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

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

    TL; DR

    我找不到这三个事件的恰当定义。可接受的答案不仅将定义三个事件(TextInput,TextInputStart和TextInputUpdate),而且还将对它们进行比较和对比。没有共享答案,请引用您的消息来源,维基百科是禁止访问的。您的成绩的25%取决于此。

    最佳答案

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

  • 标准 key :可打印字符,例如'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)。如果您有Registry setting to enable it,则也可能适用于Alt +小键盘加上2 6 3 B(对于U + 263B);我还没有证实。 (我设置了注册表设置,但没有立即生效;可能需要重新启动。)
  • 死键:我了解多语言键盘还有一些额外的东西,称为“死键”,它们可以修改以下击键。例如,您可以按“umlaut”死键,然后按“o”,将“键入”ö(带有变音符的o)。 (我可能把细节弄错了。我一直使用美国键盘,但不知道如何使用死键。)我怀疑这些键的行为类似于十进制键代码;见下文。
  • IME:表意语言使用一种叫做“输入法编辑器”的东西。我对死键的了解甚至比我对死键的了解还少,我也不知道它们是否触发这些事件。

  • 请注意,Shift和Ctrl等修饰键不会直接触发这些事件(与KeyDown不同,在KeyDown中您会看到按下Shift,然后按下了5,等等)。例如,要获取“%”,请按Shift + 5,仅生成一个事件序列(即,一个TextInputStart和一个TextInput),并且都接收字符串“%”。

    每当您开始输入字符或字符代码时,就会触发 TextInputStart 。当您按下标准键,控制键或十进制键代码的第一位时,将触发该事件。启用此功能后,系统有时(但并非总是)已经知道您要按下的键(例如标准键和控制键)。如果知道,它将在TextCompositionEventArgs中告诉您;如果不知道,则TextCompositionEventArgs为空,什么也不会告诉您。

    当您输入十进制键码的第二位和后续数字时,将触发TextInputUpdate 。除了该事件为空的TextCompositionEventArgs之外,我什么都没有看到(尽管有可能随着死键或IME的改变而改变)。

    输入 key 后,将触发 TextInput ,并且系统会确定您输入的 key ,因此在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 +数字键盘0 2 5 5.按下数字键盘0时,您将获得TextInputStart事件,该事件告诉您绝对没有用。对于每个键numpad 2,numpad 5和numpad 5,您都会得到一个TextInputUpdate事件,但又没有有用的信息(您无法分辨到目前为止已按下的数字)。释放Alt键(实际上是“键入”您输入代码的键)时,您将获得TextInput事件,以及在e.Text和e.TextComposition.Text属性中输入的键。 (这可能是不可打印的字符,例如,如果您输入了Alt +数字键盘08。)十进制键代码无法进行键重复。

    死键:如上所述,我不知道如何进行测试。如果有人有答案,请告诉我,我将在此包括在内。

    IME:同样,我不知道如何测试。

    我的印象是,对于大多数用途而言,TextInput是这些事件中唯一有意义的事件之一(因为其他两个事件并不总是告诉您任何事情)。这可能就是为什么它是在UIElement,UIElement3D和ContentElement上作为标准路由(非附加)事件重新公开的三个对象中唯一一个的原因。

    关于wpf - WPF TextCompositionManager事件的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053210/

    相关文章:

    .net - 如何在 Visual Studio 中为我的自定义控件设置要编辑的默认事件?

    javascript - getElementById() 空错误

    c# - Winforms + mysql + asp.net 对于具有远程访问功能的 C# 数据库应用程序来说足够了吗?

    cocoa - 如何跟踪 NSWindow 的打开和关闭事件?

    wpf - 将 EF4 与 Caliburn.Micro 绑定(bind) : Should I expose my Entity as a property of the ViewModel?

    events - 事件驱动架构……无限循环

    jquery - 如果它是动态的,如何使用 Jquery 获取事件元素类

    html - 带有下拉菜单的 Twitter Bootstrap 内联输入

    c# - WPF - 如何使用键(如字典)实现 ObservableCollection<K,T>?

    wpf - MSDN 示例和缺少的 SDKSample