6

我想禁止在 WPF 应用程序的输入字段中输入所有表情符号(情感图标)。我实现它的方式是:

txtUserName.PreviewTextInput += LoginPreviewTextInput;

LoginPreviewTextInput 如下所示:

private void LoginPreviewTextInput(object sender, TextCompositionEventArgs e)
{
     if (!InputValidator.IsValidInput(e.Text))
          e.Handled = true;
}

InputValidator 的 IsValidInput 如下所示:

public class InputValidator
{
    //These characters are allowed in the textbox
    private static string pattern = @"^[\w\s,\.\(\)~!@\#\$%\^&\*-=\+\[\]\{\}:;'""<>\?\\|]*$";
    public static bool IsValidInput(string previewedInput)
    {
        var matches = Regex.Matches(previewedInput, pattern);
        if (matches.Count == 1)
        {
            return true;
        }
        return false;
    }
}

奇怪的是,它适用于虚拟键盘中的所有 Emoji 图标,除了 Happy Emoji。它不起作用,因为一旦我在 Windows 虚拟键盘中输入此表情符号(它适用于所有其他表情符号),就不会调用 LoginPreviewTextInput。

快乐表情符号如下图所示:

在此处输入图像描述

当在文本框中输入快乐表情符号时,文本框如下所示:

在此处输入图像描述

快乐的表情符号已输入到文本框中。您可以看到,当文本框的文本属性为空时,甚至会显示一个水印。当我在 snoop 中查看文本框的 text 属性时,它确实是空的,而有界属性是 viewmodel 是空的(从未调用过 setter)。

同样,仅针对这个特定的表情符号(快乐的)发生。所有其他表情符号都进入 LoginPreviewTextInput 方法,不匹配正则表达式并被忽略。

4

1 回答 1

2

在花了一些时间研究这个问题之后,我找到了解决这个问题的办法。

为什么你可以按下快乐表情符号?

您能够从虚拟键盘将快乐表情符号输入到您的应用程序的原因是因为它是默认的 Windows 符号之一/具有附加的实际字符。(类似的东西)。

尽管其他表情符号可以这样显示,但我相信虚拟键盘的默认行为是仅使用这些符号,因为它们已经可用并且不需要创建各种字符。

这也发生在许多其他表情符号上,例如星星和心形。

这是按下“Happy face”时显示的内容:

显示笑脸符号的图像

这是按下“爱眼脸”时显示的内容:

显示字符代码的图像

正如您所看到的,实际发生的是所有其他表情符号都被标记为它们前面的反斜杠。

你怎么能解决你的问题?

您的问题的解决方案可能是让正则表达式检查代码是否符合设定的标准。例如,所有字符都是 [aZ] 或任何您想要的字符。这很可能是解决问题的更好方法,因为这意味着您不会创建大量排除列表。

于 2019-05-09T15:07:05.343 回答