Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么PreviewPut不处理空格?_Wpf_Events_Keyboard - Fatal编程技术网

Wpf 为什么PreviewPut不处理空格?

Wpf 为什么PreviewPut不处理空格?,wpf,events,keyboard,Wpf,Events,Keyboard,我正在处理窗口上的PreviewTPUT事件,以处理磁卡读卡器的刷卡。我在窗口上处理事件,这样就不管哪个控件被聚焦 一旦处理程序确定刷卡已启动(输入“%”或“;”字符),它将处理所有事件,直到刷卡完成。该系统通常运行良好,但有几个重要的例外: 当从读卡器输入空格字符(可能还有\n字符)时,PreviewTestInput不会处理空格字符,而是直接将其发送到聚焦的任何控件中。奇怪的是,处理程序确实接收\r字符。这会导致不期望的行为 我想要的是一种在窗口级别捕获所有关键事件的方法,如果我愿意,可以有

我正在处理窗口上的PreviewTPUT事件,以处理磁卡读卡器的刷卡。我在窗口上处理事件,这样就不管哪个控件被聚焦

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

当从读卡器输入空格字符(可能还有\n字符)时,PreviewTestInput不会处理空格字符,而是直接将其发送到聚焦的任何控件中。奇怪的是,处理程序确实接收\r字符。这会导致不期望的行为

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


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

我发现的一个解决方法是挂钩
PreviewKeyDown
,而不是
previewteimput
。不幸的是,这种方法需要更多的润色来获得他们按下的按钮的具体字符。我发现最可靠的方法是,它让我觉得很麻烦,因为我觉得它应该很简单。有人有更好的方法吗?

我在以下方面找到了一些解释:

因为一些IME会将空格击键视为文本合成过程的一部分,所以Avalon会通过TextInput事件报告正确的合成文本

更多信息,请访问:

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

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

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


是的,这与我最终使用的东西是一样的