将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]; } }
它为不同的路由事件多次引发,因此您可能希望过滤特定的事件。