2014-01-17 102 views
2

如何从虚拟键盘过滤非字母键?只允许输入字母

以下方法工作只为拉丁字母,对unfortune:

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); 
    } 

回答

2

我认为你可以使用正则表达式这一点,在你的文本框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这将导致一个小问题。不过,我已经成功地完成这一任务与检查它是否非字母数字\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; 
    } 
}