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.

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top