为什么PreviewTextInput不处理空格?

时间:2011-11-01 19:10:22

标签: wpf events keyboard

我在窗口处理PreviewTextInput事件以处理来自磁卡读卡器的滑动。我在窗口上处理事件,因此无论哪个控件都集中在哪里都无关紧要。

一旦处理程序确定滑动已启动(输入'%'或';'字符),它将处理所有事件,直到滑动完成。该系统通常运行良好,但有一些重要的例外:

当从阅读器输入空格字符(可能还有\ n字符)时,它们不会被PreviewTextInput处理,而是直接发送到任何控制的焦点。奇怪的是,处理程序确实接收\ r \ n字符。这会导致不良行为。

我想要的是一种在窗口级别捕获所有键事件的方法,并且如果我愿意,还有机会处理它们。我尝试过使用PreviewKeyDown,发现使用它有点麻烦,并从中获取char值。 PreviewTextInput更好,因为我可以简单地读取Text属性。

是否有一个原因PreviewTextInput不处理某些字符?是否有任何类似的方法来获取所有事件,包括空格?

2 个答案:

答案 0 :(得分:11)

我在this WPF forum question中找到了某种解释:

  

因为一些IME会将空白击键视为文本合成过程的一部分,这就是Avalon通过TextInput事件报告正确的合成文本的原因。

来自MSDN documentation of the TextInput event的更多信息:

  

...对于键盘输入,WPF首先发送相应的KeyDown / KeyUp事件。如果未处理这些事件且键是文本的(而不是方向箭头或功能键等控制键),则会引发TextInput事件。 KeyDown / KeyUp和TextInput事件之间并不总是简单的一对一映射,因为多次击键可以生成单个字符的文本输入,单击键可以生成多字符串。对于使用输入法编辑器(IME)在其相应字母表中生成数千个可能字符的中文,日文和韩文等语言尤其如此。

     

当WPF发送KeyUp / KeyDown事件时,如果击键可能成为TextInput事件的一部分(例如,如果按下ALT + S),则Key设置为Key.System。这允许KeyDown事件处理程序中的代码检查Key.System,如果找到,则保留对随后引发的TextInput事件的处理程序的处理。在这些情况下,TextCompositionEventArgs参数的各种属性可用于确定原始击键。同样,如果IME处于活动状态,则Key的值为Key.ImeProcessed,而ImeProcessedKey则为原始击键或击键。

顺便说一下,这是两个相关的问题:

答案 1 :(得分:5)

我找到的一个解决方法是挂钩PreviewKeyDown而不是PreviewTextInput。不幸的是,这种方法需要更多的解决方法来获取他们按下的按钮的具体字符。我找到的最可靠的方法是在this question.我觉得应该相当简单,感觉相当麻烦。任何人都有更好的方法吗?