Преобразовать ключ System.Windows.Input.KeyEventArgs в символ - PullRequest
10 голосов
/ 13 мая 2009

Мне нужно получить аргументы события как char, но когда я пытаюсь привести перечисление Key, я получаю совершенно другие буквы и символы, чем то, что было передано.

Как правильно преобразовать Ключ в символ?

Это то, что я пробовал

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

Редактировать: у меня также нет свойства KeyCode для аргументов. Я получаю их из события InputManager.Current.PreNotifyInput.

Ответы [ 5 ]

11 голосов
/ 13 мая 2009
2 голосов
/ 26 сентября 2011

Это работает для меня:

На основании последней записи я обнаружил, что в 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;
}
2 голосов
/ 05 ноября 2009

Требуется немного привыкнуть, но вы можете просто использовать значения ключей сами. Если вы пытаетесь ограничить ввод буквенно-цифровыми символами и, возможно, немного больше, приведенный ниже код поможет

    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;
        }
    }
1 голос
/ 26 февраля 2016

Я знаю, что это старый, но ни один из ответов, кажется, на самом деле не отвечает на вопрос. Причина, по которой возвращается другой символ, заключается в том, что когда вы просто пытаетесь привести его к char, вы приводите значение enum к '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)
    }
}
0 голосов
/ 03 мая 2011

Внутри вашего обработчика 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];
            }
        }

Он вызывается несколько раз для разных перенаправленных событий, поэтому вы можете захотеть отфильтровать конкретное.

...