为什么不';t Regex在PreviewKeyDown上的工作
本文关键字:PreviewKeyDown 工作 Regex 为什么不 | 更新日期: 2023-09-27 18:24:08
这是我目前阻止除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()
方法
当您按下一个非字符键,如Space、Shift或Control,或不是只有一个字符的所有键时,e.key返回一个特殊的Enum值,当完成ToString()时,该值变为(如果您按下Space)"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;
}
}