为什么不';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~!

我是不是错过了什么?

为什么不';t Regex在PreviewKeyDown上的工作

我会将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;
        }
    }