1.禁用输入法
在控件中设置该方法,注意,该方法只是禁止了”输入法“,比如搜狗之类的,但”键盘“本身的键值不受影响(原生键盘),这里是避免输入法的上屏操作会越过我们的过滤器
InputMethod.IsInputMethodEnabled ="False"
2.添加监听事件
该事件在每输入一个符号时触发
PreviewKeyDown="Tb_PreviewKeyDown""
示例
<TextBox Margin="5" InputMethod.IsInputMethodEnabled ="False" PreviewKeyDown="Tb_PreviewKeyDown" VerticalContentAlignment="Center"/>
3.在事件中处理过滤
e中包含当前的按下的键位,text包含的是之前已存在文本框的值
该过滤器只允许数字,小数点,及负号的存在,且小数点不能出现两次,不能出现在非数字的后面,负号只能出现在第一位(也可以彻底禁用负号)
通过对e.key的自由组合可实现任意限制
private void Tb_PreviewKeyDown(object sender, KeyEventArgs e)
{
//获取文本框已存在的值
TextBox tb = sender as TextBox;
string text = tb.Text;
//这里是对 - 和小数点的特殊判断
if (text != "")
{
if (e.Key == Key.OemPeriod)
{
int temp;
if (text.Contains(".")) //判断是否已经存在小数点(小数点只能存在一个)
{
e.Handled = true;
return;
}
else if (!int.TryParse(text, out temp)) //如果已存在的值不能转换成数字,说明后面不能跟小数点
{
e.Handled = true;
return;
}
e.Handled = false;
return;
}
if (e.Key == Key.OemMinus) //有值的情况下,不能输入负号。负号只能出现在第一位
{
e.Handled = true;
return;
}
}
//屏蔽非法按键
if (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) //数字0-9
{
e.Handled = false; //合法,通过
return;
}
if (e.Key >= Key.D0 && e.Key <= Key.D9) //小键盘 0- 9
{
e.Handled = false;
return;
}
if (e.Key == Key.Back || e.Key == Key.Subtract) //回退/中文-/英文 -
{
e.Handled = false;
return;
}
// if (e.Key >= Key.OemMinus) //彻底禁用负号
// {
// e.Handled = false;
// return;
// }
e.Handled = true; //如果都没匹配上,就设为不合法
4.其他方法
1.使用正则
该正则用于过滤0-9 小数点及负号,但是存在两个问题
- 能判断当前值,因为我们获取的只是键值,不能通过键值判断到底是什么符号(可能是我不知道获取方法),只能通过正则匹配已存在的值,具有滞后性
- 对于小数点负号的次数及位置判断
//^[0-9.\-]+$
Regex re = new Regex("[^0-9.]+");
e.Handled = re.IsMatch(e.Text);
正则我不熟,如果有办法可以解决的话,还是比较简单的