我想验证在文本框中输入的信息 - 我将只允许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;
}
}
问题是我无法正确识别生成的真实字符是什么。例如:
给我(这是调试语句生成的代码)而不是Я
:
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
我相信这就是验证失效的原因。
答案 0 :(得分:0)
遵守MSDN KeyRoutedEventArgs.Key不一定代表按下的键的映射Unicode字符:
根据输入设备,这可以是映射值。对于原始, 未映射的事件数据,请参阅OriginalKey属性。
在您的情况下(键盘设备),它只代表virtual keys,并且TextBox在内部执行映射过程以将虚拟键转换为零个或多个unicode字符。在Win32中,它可以通过MapVirtualKey函数完成,但在WinRT中没有类似的东西。
您有几个选择:
答案 1 :(得分:0)
KeyRoutedEventArgs
的Key
属性返回映射的事件值。使用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;
}