Convertir une clé System.Windows.Input.KeyEventArgs en char
-
21-08-2019 - |
Question
Je dois obtenir les args d'événements comme char
, mais lorsque je tente couler la clé ENUM Je reçois des lettres complètement différentes et des symboles que ce qui a été transmis.
Comment convertir correctement la clé de char?
Voici ce que j'ai essayé
ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key));
Edit: Je ne dispose pas non plus la propriété CodeTouche sur les args. Je les obtenir de l'événement InputManager.Current.PreNotifyInput.
La solution
Voir Comment convertir un caractère en valeur équivalente à System.Windows.Input.Key Enum?
Utilisez plutôt KeyInterop.VirtualKeyFromKey
.
Autres conseils
Il faut un peu pour s'y habituer, mais vous pouvez simplement utiliser les valeurs clés elles-mêmes. Si vous essayez de limiter l'entrée à caractères alphanumériques et peut-être un peu plus, le code ci-dessous peut aider.
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;
}
}
Ce travail pour moi:
Basé sur la dernière entrée que j'ai trouvé que dans WPF il n'y a pas d'événement PreNotifyInput
, mais je l'ai trouvé et équivalent PreviewTextInput
D'abord, j'essaie avec un RegExp
, mais je ne peux pas le faire fonctionner, alors j'utiliser un simple 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;
}
Je sais que c'est vieux, mais aucune des réponses semble répondre effectivement à la question. La raison pour laquelle un autre omble chevalier vient est de retour parce que quand vous essayez juste de le jeter à vous char
la coulée de la valeur ENUM à un « char ». Cependant:
var keyPressed = e.key.ToString();
Fonctionne très bien. Renvoie la touche enfoncée comme une chaîne. Ensuite, vous vérifiez la longueur. Si c'est == 1 alors il est un char, chiffre ou symbole. Si elle est supérieure à 1, il est une clé spéciale.
Si vous voulez juste l'omble chevalier, vous pouvez alors faire keyPressed[0];
Voici comment je le fais.
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)
}
}
Dans votre gestionnaire PreNotifyInput, essayez quelque chose comme ceci:
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];
}
}
Il soulève plusieurs fois pour les différents événements routés, de sorte que vous pouvez filtrer un particulier.