从Windows 10虚拟键盘进入WPF文本框的快乐表情符号未在文本框的PreviewTextInput事件中捕获

Dim*_*maK 6 c# wpf events virtual-keyboard

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

txtUserName.PreviewTextInput += LoginPreviewTextInput;
Run Code Online (Sandbox Code Playgroud)

LoginPreviewTextInput看起来如下:

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

在此输入图像描述

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

同样,只发生在这个特定的表情符号(快乐的表情符号)上.所有其他表情符号都到达LoginPreviewTextInput方法,与正则表达式不匹配并被忽略.

use*_*480 3

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

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

您能够从虚拟键盘将快乐表情符号输入到您的应用程序中的原因是它是默认的 Windows 符号之一/附加了一个实际的字符。(沿着这些思路)。

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

许多其他表情符号(例如星星和心形)也会发生这种情况。

这是当您按“笑脸”时显示的内容:

显示笑脸符号的图像

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

显示字符代码的图像

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

你如何解决你的问题?

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