这是我的代码,以防止alphanumeric
之外的所有字符。但这不起作用。
private void LoginUsername_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (Regex.IsMatch(e.Key.ToString(), @"[^a-zA-Z0-9]"))
{
e.Handled = true; // BreakPoint 'doesn't break'
}
if (e.Key == Key.Space)
{
e.Handled = true; // BreakPoint 'breaks'
}
}
使用KeyDown Event
>不起作用。
使用TextChange Event
>工作得很好〜!
我甚至在BreakPoint
中尝试PreviewKeyDown
,但它从未到达e.Handle
〜!
我错过了什么吗?
答案 0 :(得分:3)
我会将e.Key
投射到int
并检查数值是否与您允许的符号匹配,而不是使用ToString()
方法
答案 1 :(得分:1)
当您按下Space或Shift或Control之类的非字符键或者不仅仅是1个单个字符的所有内容时,e.Key会返回一个特殊的Enum值,当ToString()成为时(如果按下)空间)"空间"。 Regex.IsMatch(string, @"[^a-zA-Z0-9]")
检查:"这是非字母数字字符"。但是,因为你没有在你的正则表达式中包含^和$来指示你需要匹配整个字符串,而不仅仅是一个子字符串,它基本上检查"所有字符都是非字母数字的吗?&#34 ;因为" Space"有字母数字字符,找不到匹配。
尝试使用正则表达式@"^[^a-zA-Z0-9]$"
,因为这会将整个字符串与非字母数字字符进行比较,而不仅仅是单个字符。
是的,正如tDragon建议的那样,与字符串的intvalue进行比较可能是一个可行的选择。
答案 2 :(得分:1)
我发现使用TextInput
事件比KeyDown
所以,这是我的解决方案,让其他人受益:
private async void LoginUsername_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Char keyChar = (Char)System.Text.Encoding.ASCII.GetBytes(e.Text)[0];
if (Regex.IsMatch(keyChar.ToString(), @"[^a-zA-Z0-9]"))
{
e.Handled = true;
}
}