转换一个System.Windows.Input.KeyEventArgs键为char
-
21-08-2019 - |
题
我需要得到事件参数为char
,但是当我尝试铸造重点枚举我得到比在通过完全不同的字母和符号。
你如何正确的密钥转换为char?
这是我已经试过
ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key));
编辑:我还没有对ARGS的键码属性。我让他们从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 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ";
return Lista.IndexOf(_char.ToUpper()) != -1;
//System.Text.RegularExpressions.Regex RegVal = new System.Text.RegularExpressions.Regex(@"(?<LETRAS>[A-Z]+)+(?<NUMERO>[0-9]+)+(?<CAR>[!|""|#|$|%|&|'|(|)|*|+|,|\-|.|/|:|;|<|=|>|?|@]+)+");
//return RegVal.IsMatch(_char);
}
private void textBoxDescripcion_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!ValidChar(e.Text))
e.Handled = true;
}
我知道这是旧的,但没有一个答案似乎居然回答这个问题。不同的炭回来的原因是因为当你只是尝试将其转换为char
你是铸造枚举值的“字符”。但是:
var keyPressed = e.key.ToString();
巨大的。返回按下一个字符串的关键。然后,你检查的长度。如果它的== 1那么它是一个字符,数字或符号。如果它是大于1这是一个特殊的键。
如果你只是想炭那么你可以做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];
}
}
它提出了多次针对不同的路由事件,所以你可能要筛选特定的一个。
不隶属于 StackOverflow