最近修改的一個需求要求捕獲鍵盤輸入的 Text,包括各種標點符合。 最開始想到的是 PreviewKeyDown 或者 PreviewKeyUp 這樣的鍵盤事件。 但是這兩個事件的對象 KeyEventArgs 不夠用,得依靠判斷 Key 來判斷輸入了什麼,然後再根據判斷寫死一個相應鍵位的 Text ...
最近修改的一個需求要求捕獲鍵盤輸入的 Text,包括各種標點符合。
最開始想到的是 PreviewKeyDown 或者 PreviewKeyUp 這樣的鍵盤事件。
但是這兩個事件的對象 KeyEventArgs 不夠用,得依靠判斷 Key 來判斷輸入了什麼,然後再根據判斷寫死一個相應鍵位的 Text 來獲取數據。
如組合鍵獲取 乘號鍵 需要用到 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 的原因
隨後花了點時間找了下國外博客,然後發現了這個文章(引用1),其實文章內的解決方案博客園也能找到幾篇,但是不詳細一筆帶過。
這是我根據文章內寫的代碼
XAML:
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#:
1 private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e) 2 { 3 var input = e.Text; 4 }
引用
http://stackoverflow.com/questions/2924928/wpf-previewkeydown-event-and-underscore-char
總結
關於PreviewKeyDown和KeyDown的區別園區里也有很多相關的文章,以後我也將會寫一個,畢竟我也碰到過這個坑...