2010-05-27 107 views
2

我在我的WPF組件中使用PreviewKeyDown事件捕捉關鍵點擊。我需要區分輸入的字符:字母與數字,下劃線與其他任何字符。WPF,PreviewKeyDown事件和下劃線字符

字母和數字正常工作(只需將KeyEventArgs對象的Key屬性轉換爲字符串並使用該字符串的字符0),但這不適用於下劃線。它的ToString值取決於本地鍵盤設置(在EN/US鍵盤上顯示爲「OemMinus」,在CZ/QWERTY鍵盤上顯示爲「OemQuestion」)。

那麼,如果在PreviewKeyDown事件中輸入的字符是下劃線,我該如何找到RELIABLY?

感謝所有幫助

回答

1

最後,我不得不重寫整個事情(和它的基礎上被輸入到textarea的文字),

0

了toString值回來爲這些不同的按鍵,因爲它拿到鑰匙的名字,不一定是你想測試字符值。我真的推薦在那裏使用Key枚舉...

就你的問題而言,我不是100%確定你正在嘗試做什麼(這對視頻遊戲等沒有幫助。 ),但也許UIElement.PreviewTextInput event可以幫助 - 而不是必須趕上個別按鍵,你會得到實際的文字輸入,這有助於在其他情況下,如在處理語音識別等。

它從你的評論說你試圖捕獲非角色指標以及角色指標;這些可能會相互衝突(特別是在壓縮鍵盤上),所以看起來MS以這樣一種方式構建了框架,即情況不會被意外忽略。 (您的具體情況顯示了兩個不同鍵盤上的Shift +短劃線和Shift +?之間的區別;我確定還有更多。)我建議您只查找按鍵,並讓應用程序的最終用戶能夠重新修改鍵綁定。

這提醒我,小心使用「MouseDown」事件,因爲它們不會發生在觸摸表面(例如Microsoft Surface)上 - 最好爲所有可用事件編寫代碼。

祝您的項目順利!

1

UPDATE:

這是一個有點亂,但一些重構後,它可以幫助你。 我使用預覽事件捕獲文本並強制發送我想要的密鑰;我忽略了預覽處理程序中的所有其他鍵。我確實從KeyDown切換到了KeyUp,讓預覽事件先觸發。我使用_clearNext標誌來跳過/清除關鍵事件。

在XAML

<Window x:Class="EmployeeNavigator.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    PreviewTextInput="Window_PreviewTextInput" 
    Keyup="Window_KeyUp" 
    Height="400" 
    Width="600" 
    MinWidth="600"> 
</Window> 

代碼隱藏檢測和過程_

private bool _clearNext = false; 
    private void Window_KeyUp(object sender, KeyEventArgs e) 
    { 
    if (_clearNext) 
    { 
     _clearNext = false; 
     e.Handled = true; 
    } 
    else if (e.Key == Key.OemMinus) 
    { 
     e.Handled = true; 
    } 
    else if (e.Key == Key.OemQuestion) 
    { 
     e.Handled = true; 
    } 
    } 

    private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e) 
    { 
    if (e.Text.Equals("_")) 
    { 
     KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, 
      Keyboard.PrimaryDevice.ActiveSource, 0, Key.OemMinus); 
     args.RoutedEvent = Keyboard.KeyUpEvent; 
     InputManager.Current.ProcessInput(args); 
     e.Handled = true; 
     _clearNext = true; 
    } 
    else if (e.Text.Equals("?")) 
    { 
     KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, 
      Keyboard.PrimaryDevice.ActiveSource, 0, Key.OemQuestion); 
     args.RoutedEvent = Keyboard.KeyUpEvent; 
     InputManager.Current.ProcessInput(args); 
     e.Handled = true; 
     _clearNext = true; 
    } 
    } 

我會添加一定有更好的辦法。

+1

的問題是我需要檢測也Esc鍵,返回鍵和Shift鍵,這將無法使用TextInput :( 必須有一種方法來將密鑰轉換爲被鍵入的字符:( – 2010-05-28 07:32:16