c# WPF中对输入值任意限制的方法及通用示例

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

正则我不熟,如果有办法可以解决的话,还是比较简单的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值