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

11

我需要将事件参数转换为char,但是当我尝试将Key枚举进行类型转换时,得到的结果完全不同于传入的字母和符号。

如何正确地将Key转换为char?

这是我尝试过的:

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

编辑:我从InputManager.Current.PreNotifyInput事件获取参数,也没有KeyCode属性。

5个回答

11

1
这实际上不起作用。如果你按除字符或数字以外的任何键,你会得到一个随机的其他字符。 - Jules

2

这对我很有帮助:

通过最近的一次搜索,我发现在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

需要一点时间来适应,但是可以直接使用键值。如果你想限制输入为字母数字和一些额外字符,下面的代码可能会有帮助。

    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

我知道这篇文章有点老,但是没有一个答案真正回答了问题。不同的字符出现的原因是因为当你试图将它强制转换为char时,你正在将枚举值转换为'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
在您的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];
    }
}

它会在不同的路由事件中多次触发,因此您可能希望过滤特定的事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接