【问题标题】:Get Char from Key从键中获取字符
【发布时间】:2011-11-11 02:48:10
【问题描述】:

我正在编写一个自定义文本编辑器,我使用 KeyDown 和 KeyUp 事件。该事件从包含“Key”实例的参数中获取 KeyEventArgs。

我怎样才能把那个“钥匙”变成一个真正的字符?

使用带有“.”的 Key.ToString()我得到一个“OmePeriod”或“,”我得到一个“OmeComma”。我可以直接转换这些值……但这是一项艰苦的工作,而且我确信必须存在任何将键转换为真正的“字符”的类。

谢谢!

问候。

【问题讨论】:

标签: c# wpf keydown text-editor


【解决方案1】:

这里的主要问题是您捕获的事件是卷轴键盘事件,并且键确实是键而不是字符。中间是键映射!例如,当键入 shift-A 时,您将收到两个事件而不是一个按键事件。

这个讨论可以提供帮助:C# How to translate virtual keycode to char?

【讨论】:

    【解决方案2】:

    尝试使用TextInput 事件,而不是使用KeyDown 事件。附加一个如下所示的事件处理程序:

    private void Grid_TextInput(object sender, TextCompositionEventArgs e)
    {
        Char keyChar = (Char)System.Text.Encoding.ASCII.GetBytes(e.Text)[0];
        Debug.WriteLine(keyChar);
    }
    

    注意,这仅抓取第一个字节,这不适用于国际 (Unicode) 文本。它也可能不适用于更复杂的文本输入事件,因此请注意!

    有关更多信息,请参阅this MSDN article

    【讨论】:

    • 在 wpf 中捕获文本输入有很多问题,有些答案甚至是指系统 dll。但你的答案是迄今为止我见过的最好的
    【解决方案3】:

    这正是您所需要的……键盘键码中的特定于语言环境的字符……

    how to capture the '#' character on different locale keyboards in WPF/C#?

    【讨论】:

    • 谢谢!这就是我一直在寻找的!
    【解决方案4】:
    【解决方案5】:

    将 e.KeyValue 转换为 char。比如:

    例如。

    private void myTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        char pressedCharacter = (char)e.KeyValue;
    }
    

    【讨论】:

    • 没有e.KeyValue
    • 这就是我追求的目的。感谢您提供有用的答案!
    • 我刚刚意识到这可能会返回不好的结果,可能根本不应该使用。当我使用它时,我点击了NumberPad 8 键,它显示为 KeyData 和 KeyCode,其 KeyValue 为 104。另一方面,当使用(char)e.KeyValue 时,值104 转换为字符h 而不是8
    • 我找到的最佳方法位于stackoverflow.com/a/35377638/1039753
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2011-03-21
    • 2013-07-02
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多