最近修改的一个需求要求捕获键盘输入的 Text,包括各类标点符号。spa
最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件。code
可是这两个事件的对象 KeyEventArgs 不够用,得依靠判断 Key 来判断输入了什么,而后再根据判断写死一个相应键位的 Text 来获取数据。xml
如组合键获取 乘号键 须要用到 Shift + 8(数字键盘那的乘号键是 Key.Multiply ,而须要在主键盘位获取则须要用到组合键)对象
1 private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 2 { 3 if(e.KeyStates == Keyboard.GetKeyStates(Key.D8) && Keyboard.Modifiers == ModifierKeys.Shift) 4 { 5 var input = "*"; 6 } 7 }
这种办法既不友好且须要用到其余标点符号时还得另外加 if 条件,并且会发生 Key 冲突的问题,如上你输入完 乘号键 之后可能还会多加一个“8”,因为 Key.D8 的缘由blog
随后花了点时间找了下国外博客,而后发现了这个文章(引用1),其实文章内的解决方案博客园也能找到几篇,可是不详细一笔带过。事件
这是我根据文章内写的代码ip
XAML:underscore
1 <Window x:Class="Dome.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 PreviewTextInput="Window_PreviewTextInput" 5 Height="400" 6 Width="600" 7 MinWidth="600"> 8 </Window>
C#:get
1 private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e) 2 { 3 var input = e.Text; 4 }
引用input
http://stackoverflow.com/questions/2924928/wpf-previewkeydown-event-and-underscore-char
总结
关于PreviewKeyDown和KeyDown的区别园区里也有不少相关的文章,之后我也将会写一个,毕竟我也碰到过这个坑...