2009-06-27 68 views
8

关于此的文档非常低劣。您可以通过TextCompositionManager访问许多事件来监视和控制文本输入。如果你想做一些事情,比如抓取数据,那么这就是你要做的地方。有关WPF TextCompositionManager事件的帮助

有三个事件的关注文本输入:的TextInputTextStartTextUpdate。每个事件有两个版本,其中一个事件是隧道效应(从窗口向下移动到具有焦点的控件),当它是冒泡(从关注的UI元素向上移动到窗口):

隧道:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

冒泡:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

因此,根据凡在你钩到的TextCompositionManager逻辑树,您可以修改这些文本事件然后才能到达事件的焦点,或者之后再查看它们。所有这些在文档和使用中都非常简单明了。


TL; DR

我无法找到这三个事件的一个体面的定义。一个可以接受的答案不仅会定义三个事件(TextInput,TextInputStart和TextInputUpdate),还会对它们进行比较和对比。没有共享的答案,请参考您的来源和维基百科是关闭限制。 25%的成绩取决于此。

回答

17

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

  • 标准键:可打印字符,如 '一个', 'A', '5', '%',退格,依此类推。
  • 控制键: Ctrl + C键,Ctrl + H键,Ctrl + M键等
  • 十进制关键代码:之类的东西ALT +小键盘2 5 5(对IBM扩展ASCII代码255,这是Unicode不间断空格U + 00A0)和Alt +数字键盘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带有变音符号)。 (我可能有细节错误,我一直使用en-US键盘,我不知道如何使用死锁。)我怀疑这些行为与十进制键代码类似;见下文。
  • IME:表意语言使用称为“输入法编辑器”的东西。我对这些事情的了解甚至比我对死钥匙知道得更少,我不知道他们是否解雇了这些事件。

请注意,像Shift和Ctrl这样的修饰键不会直接触发这些事件(不像KeyDown那里你看到Shift被按下,然后被按下等等)。例如,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.只要按下数字键盘0,就会得到一个TextInputStart事件,它告诉你绝对没有用。对于每个键击numpad 2,numpad 5和numpad 5,您将得到一个TextInputUpdate事件,同样没有任何有用的信息(至今未知哪些数字已被按下)。当你释放Alt键(实际上“键入”你输入的代码的键)时,你将得到TextInput事件,你输入的键是e.Text和e.TextComposition.Text属性。 (这可能是一个不可打印的字符,例如,如果您输入了Alt +数字键盘0 8.)对于十进制键代码,键重复是不可能的。

死锁:正如我上面提到的,我不知道如何测试这个。如果任何人有答案,让我知道,我会在这里包括它。

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


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

+0

哇,这是一个壮观的答案。你以优异的成绩毕业。我标记你的答案是令人满意的,但请回顾下面的相关问题,你可能会帮助我:http://stackoverflow.com/questions/1053533/how-can-i-prevent-input-controls-from-偷字符从空格字符 – Will 2009-06-27 20:17:13