C# 将 System.Windows.Input.KeyEventArgs 键转换为字符

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/855047/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 04:21:01  来源:igfitidea点击:

Convert a System.Windows.Input.KeyEventArgs key to a char

c#wpfkeyeventargs

提问by Brandon

I need to get the event args as a char, but when I try casting the Key enum I get completely different letters and symbols than what was passed in.

我需要将事件参数作为 a 获取char,但是当我尝试投射 Key 枚举时,我得到的字母和符号与传入的完全不同。

How do you properly convert the Key to a char?

你如何正确地将密钥转换为字符?

This is what I've tried

这是我试过的

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

Edit: I also don't have the KeyCode property on the args. I'm getting them from the InputManager.Current.PreNotifyInput event.

编辑:我在 args 上也没有 KeyCode 属性。我从 InputManager.Current.PreNotifyInput 事件中获取它们。

采纳答案by Wallstreet Programmer

回答by fortune

It takes a little getting used to, but you can just use the key values themselves. If you're trying to limit input to alphanumerics and maybe a little extra, the code below may help.

这需要一点时间来适应,但您可以只使用键值本身。如果您试图将输入限制为字母数字,也许还有一点额外的,下面的代码可能会有所帮助。

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

回答by Tank Gamer

Inside your PreNotifyInput handler, try something like this:

在您的 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];
            }
        }

It raises multiple times for the different routed events, so you may want to filter for a particular one.

它针对不同的路由事件多次引发,因此您可能需要过滤特定事件。

回答by user964055

That work for me:

这对我有用:

Based on the last entry i found that in WPF there is no such event PreNotifyInput, but i found and equivalent PreviewTextInput

根据最后一个条目,我发现在 WPF 中没有这样的事件PreNotifyInput,但我发现并且等效PreviewTextInput

First I try with a RegExp, but I cant make it work, then I use a simple indexOf.

首先我尝试使用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;
}

回答by Anthony Nichols

I know this is old, but none of the answers seem to actually answer the question. The reason a different char is coming back is because when you just try to cast it to a charyou are casting the enum value to a 'char'. However:

我知道这是旧的,但似乎没有一个答案实际上回答了这个问题。一个不同的字符回来的原因是因为当您尝试将它转换为 a 时,char您正在将枚举值转换为“字符”。然而:

var keyPressed = e.key.ToString();

Works great. Returns the key pressed as a string. Then you check the length. If it's == 1 then it's a char, number or symbol. If it's greater than 1 it's a special key.

效果很好。以字符串形式返回按下的键。然后你检查长度。如果它是 == 1 那么它是一个字符、数字或符号。如果它大于 1,则它是一个特殊键。

If you just want the char you can then do keyPressed[0];

如果您只想要字符,则可以执行 keyPressed[0];

This is how I do it.

我就是这样做的。

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