[英]Why doesn't Regex work on a PreviewKeyDown?
目前这是我的代码,以防止除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
>效果更好〜!
我什至在PreviewKeyDown
尝试了BreakPoint
,但它从未命中e.Handle
!
我想念什么吗?
我将e.Key
为int
然后检查数字值是否与您允许的符号匹配,而不是使用ToString()
方法
当您按下空格键或Shift键或Control键之类的非字符键或所有不只是1个单个字符的键时,e.Key将返回一个特殊的Enum值,完成后,该ToString()变为(如果您按空格键)“ Space”。 Regex.IsMatch(string, @"[^a-zA-Z0-9]")
检查:“这是一个非字母数字字符”。 但是,由于您不在正则表达式中包含^和$来表示需要匹配整个字符串,而不仅仅是子字符串,因此它基本上会检查“所有字符都是非字母数字吗?”。 由于“空格”具有字母数字字符,因此找不到匹配项。
尝试使用Regex @"^[^a-zA-Z0-9]$"
,因为这会将整个字符串比较为非字母数字字符,而不仅仅是单个字符。
是的,正如tDragon所建议的,与字符串的intvalue进行比较可能是一个可行的选择。
我发现使用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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.