如何从虚拟键盘中过滤非字母键?
以下方法适用于拉丁字母,不幸的是:
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);
}
答案 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;
}
}