最近修改的一個需求要求捕獲鍵盤輸入的 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的區別園區裏也有不少相關的文章,之後我也將會寫一個,畢竟我也碰到過這個坑...