Frage

Ich brauche die Veranstaltung args als char zu bekommen, aber wenn ich den Schlüssel Enum versuchen Casting bekomme ich ganz andere Buchstaben und Symbole als das, was in übergeben wurde.

Wie konvertieren Sie richtig den Schlüssel zu einem char?

Das ist, was ich habe versucht,

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

Edit: Ich weiß nicht auch die KeyCode Eigenschaft auf den args haben. Ich bin sich aus dem InputManager.Current.PreNotifyInput Ereignisse zu bekommen.

War es hilfreich?

Lösung

Andere Tipps

Es dauert ein wenig gewöhnungsbedürftig, aber man kann nur die Schlüsselwerte selbst nutzen. Wenn Sie versuchen, Eingang alphanumerics zu begrenzen und vielleicht ein wenig mehr, kann der Code unten helfen.

    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;
        }
    }

Diese Arbeit für mich:

auf dem letzten Eintrag Basierend ich, dass es in WPF gefunden ist kein solches Ereignis PreNotifyInput, aber ich fand und äquivalenter PreviewTextInput

Zuerst versuche ich mit einem RegExp, aber ich kann es nicht funktioniert, dann verwende ich eine einfache 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;
}

Ich weiß, das ist alt, aber keine der Antworten scheint tatsächlich die Frage zu beantworten. Der Grund, ein anderes Zeichen wird wieder kommen, weil, wenn Sie nur versuchen, es zu einem char werfen Sie den Enum-Wert auf einen ‚char‘ werfen. Allerdings:

var keyPressed = e.key.ToString();

Arbeiten groß. Gibt den Schlüssel als String gedrückt. Dann überprüfen Sie die Länge. Wenn es == 1, dann ist es ein Zeichen, eine Zahl oder Symbol. Wenn es größer als 1 ist, es ist eine spezielle Taste.

Wenn Sie nur die Zeichen möchten, können Sie dann keyPressed[0]; tun

Dies ist, wie ich es tun.

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)
    }
}

In Ihrem PreNotifyInput Handler, versuchen, etwas wie folgt aus:

        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];
            }
        }

Es stellt mich mehrfach für die verschiedene Routingereignisse, so dass Sie für einen bestimmten filtern mögen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top