为什么PreviewTextInput不处理空格?

cap*_*aig 19 keyboard wpf events

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

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

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

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

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

sin*_*law 12

我在这个WPF论坛问题中找到了某种解释:

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

以及来自TextInput事件MSDN文档的更多信息:

...对于键盘输入,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则提供原始击键或击键.

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


cap*_*aig 6

我找到的一个解决方法是挂钩PreviewKeyDown而不是PreviewTextInput.不幸的是,这种方法需要更多的解决方法来获取他们按下的按钮的具体字符.我找到的最可靠的方法就是这个问题.对于我认为应该相当简单的事情来说,这感觉非常麻烦.有人有更好的方法吗?