仅允许输入字母

时间:2014-01-17 16:45:18

标签: windows-phone-7 windows-phone-8 windows-phone

如何从虚拟键盘中过滤非字母键?

以下方法适用于拉丁字母,不幸的是:

public static bool IsLetter(int val) {
        return InRange(val, 65, 90) || InRange(val, 97, 122) || InRange(val, 192, 687) || InRange(val, 900, 1159) ||
               InRange(val, 1162, 1315) || InRange(val, 1329, 1366) || InRange(val, 1377, 1415) ||
               InRange(val, 1425, 1610);
    }

    public static bool InRange(int value, int min, int max) {
        return (value <= max) & (value >= min);
    }

1 个答案:

答案 0 :(得分:2)

我认为您可以使用正则表达式,在TextBox的KeyUp事件中触发 - 当用户释放键时,该方法将检查他按下的内容是否符合您的要求。它可以看起来像这样:

myTextbox.KeyUp += myTextbox_KeyUp; // somewhere in Page Constructor

private void myTextbox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
    Regex myReg = new Regex(@"\d");
    if (myReg.IsMatch(e.Key.ToString()) || e.Key == Key.Unknown)
    {
       string text = myTextbox.Text;
       myTextbox.Text = text.Remove(text.Length - 1);
       myTextbox.SelectionStart = text.Length;
    }
}

上面的代码检查任何按下的数字或未知的密钥(调试以查看它们是什么) - 如果用户按下数字,则最后输入的字符将从文本中删除。您也可以使用不同的方式定义正则表达式,例如只允许使用字母:

Regex myReg = new Regex(@"^[a-zA-Z]+$");
if (!myReg.IsMatch(e.Key.ToString()) || e.Key == Key.Unknown)
{ // the same as above }

我假设您已经设置了键盘的scope

编辑 - 非拉丁语键盘

如果您使用例如西里尔语,上面的代码将不会授予成功,那么e.Key将是Key.Unknown,这会导致一些小问题。但我设法处理这个任务,检查输入的最后一个字符,如果它是nonAlphaNumeric \W或数字\d,删除它 - 即使有奇怪的字符也能正常工作:

private void myTextbox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
   string added = myTextbox.Text.ElementAt(myTextbox.Text.Length - 1).ToString();
   Regex myReg = new Regex(@"[\W\d]");

   if (myReg.IsMatch(added))
   {
      string text = myTextbox.Text;
      myTextbox.Text = text.Remove(text.Length - 1);
      myTextbox.SelectionStart = text.Length;
   }
}