将System.Windows.Input.KeyEventArgs键转换为char

我需要将事件args作为char ,但是当我尝试转换Key枚举时,我得到的字母和符号与传入的完全不同。

你如何正确地将Key转换为char?

这就是我尝试过的

 ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key)); 

编辑:我也没有args上的KeyCode属性。 我从InputManager.Current.PreNotifyInput事件中获取它们。

请参见如何将字符转换为等效的System.Windows.Input.Key枚举值? 请改用KeyInterop.VirtualKeyFromKey

它需要一点点习惯,但你可以自己使用键值。 如果您尝试将输入限制为字母数字并且可能需要额外的一些,则下面的代码可能有所帮助。

  private bool bLeftShiftKey = false; private bool bRightShiftKey = false; private bool IsValidDescriptionKey(Key key) { //KEYS ALLOWED REGARDLESS OF SHIFT KEY //various editing keys if ( key == Key.Back || key == Key.Tab || key == Key.Up || key == Key.Down || key == Key.Left || key == Key.Right || key == Key.Delete || key == Key.Space || key == Key.Home || key == Key.End ) { return true; } //letters if (key >= Key.A && key <= Key.Z) { return true; } //numbers from keypad if (key >= Key.NumPad0 && key <= Key.NumPad9) { return true; } //hyphen if (key == Key.OemMinus) { return true; } //KEYS ALLOWED CONDITITIONALLY DEPENDING ON SHIFT KEY if (!bLeftShiftKey && !bRightShiftKey) { //numbers from keyboard if (key >= Key.D0 && key <= Key.D9) { return true; } } return false; } private void cboDescription_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.LeftShift) { bLeftShiftKey = true; } if (e.Key == Key.RightShift) { bRightShiftKey = true; } if (!IsValidDescriptionKey(e.Key)) { e.Handled = true; } } private void cboDescription_PreviewKeyUp(object sender, KeyEventArgs e) { if (e.Key == Key.LeftShift) { bLeftShiftKey = false; } if (e.Key == Key.RightShift) { bRightShiftKey = false; } } 

这对我有用:

基于最后一个条目,我发现在WPF中没有这样的事件PreNotifyInput ,但我发现并等效的PreviewTextInput

首先我尝试使用RegExp ,但我无法使其工作,然后我使用一个简单的indexOf

 private bool ValidChar(string _char) { string Lista = @" ! "" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ ABCDEFGHIJKLMNOPQRSTU VWXYZ "; return Lista.IndexOf(_char.ToUpper()) != -1; //System.Text.RegularExpressions.Regex RegVal = new System.Text.RegularExpressions.Regex(@"(?[AZ]+)+(?[0-9]+)+(?[!|""|#|$|%|&|'|(|)|*|+|,|\-|.|/|:|;|<|=|>|?|@]+)+"); //return RegVal.IsMatch(_char); } private void textBoxDescripcion_PreviewTextInput(object sender, TextCompositionEventArgs e) { if (!ValidChar(e.Text)) e.Handled = true; } 

我知道这已经过时了,但答案似乎都没有回答这个问题。 返回不同char的原因是因为当您尝试将其转换为char您将枚举值转换为’char’。 然而:

 var keyPressed = e.key.ToString(); 

效果很好。 返回按字符串键的键。 然后你检查长度。 如果它是== 1那么它是一个字符,数字或符号。 如果它大于1则是一个特殊键。

如果你只想要char,那么你可以做keyPressed[0];

我就是这样做的。

 private void scrollViewer_KeyDown(object sender, KeyEventArgs e) { if (!e.IsRepeat) { var keyPressed = e.Key.ToString(); if(keyPressed.Length == 1) CharKeyPressed(keyPressed[0]); else if(keyPressed.Length > 1) HandleSpecialKey(keyPressed) } } 

在PreNotifyInput处理程序中,尝试以下方法:

  if (e.StagingItem.Input is System.Windows.Input.TextCompositionEventArgs) { if (!String.IsNullOrEmpty((e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text)) { Char c = (e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text[0]; } } 

它为不同的路由事件多次引发,因此您可能希望过滤特定的事件。