如何使用KeyRoutedEventArgs定义生成的字符?

时间:2015-05-18 09:26:21

标签: c# regex windows-runtime windows-phone-8.1

我想验证在文本框中输入的信息 - 我将只允许Cyrillic个字符。为此,我使用以下正则表达式:

  

@" [\ u0400- \ u04FF] {1}"

并将函数绑定到文本框的KeyDown事件。请注意,表达式工作正常。

以下是代码:

private void txtBoxName_KeyDown(object sender, KeyRoutedEventArgs e)
{
    Debug.WriteLine(e.Key.ToString());
    Debug.WriteLine(Regex.IsMatch(e.Key.ToString(), @"[\u0400-\u04FF]{1}"));

    if (e.Key == Windows.System.VirtualKey.Back || Regex.IsMatch(e.Key.ToString(), @"[\u0400-\u04FF]{1}"))
    {
        //return true;
    }
    else
    {
        e.Handled = true;
    }
}

问题是我无法正确识别生成的真实字符是什么。例如:

enter image description here

给我(这是调试语句生成的代码)而不是Я

Shift 'MST_61462004_E1T04.exe' (CoreCLR: .): Loaded 
'C:\windows\system32\System.Runtime.WindowsRuntime.NI.DLL'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
False 
S 
False

我相信这就是验证失效的原因。

2 个答案:

答案 0 :(得分:0)

遵守MSDN KeyRoutedEventArgs.Key不一定代表按下的键的映射Unicode字符:

  

根据输入设备,这可以是映射值。对于原始,   未映射的事件数据,请参阅OriginalKey属性。

在您的情况下(键盘设备),它只代表virtual keys,并且TextBox在内部执行映射过程以将虚拟键转换为零个或多个unicode字符。在Win32中,它可以通过MapVirtualKey函数完成,但在WinRT中没有类似的东西。

您有几个选择:

  • 在TextBox的TextChanged事件上进行验证(我更喜欢这个)
  • 使用与here
  • 所述的预期键盘布局紧密耦合的非常简单的映射
  • 实现完整版MapVirtualKey(需要付出很多努力)

答案 1 :(得分:0)

KeyRoutedEventArgsKey属性返回映射的事件值。使用KeyRoutedEventArgs.OriginalKey获取未映射的值。

  

根据输入设备的不同,输入按钮可能会映射到不同的键值。

此外,您不必使用{1}量词,它是多余的,因为字符类[\u0400-\u04FF]正在捕获1个字符。或者,为了缩短它,您可以使用Unicode类别类\p{IsCyrillic}

所以,使用

if (e.Key == Windows.System.VirtualKey.Back ||
    Regex.IsMatch(e.OriginalKey.ToString(), @"[\u0400-\u04FF]"))
{
    //return true;
}