关于WPF TextBox只能输入数字并不是一个很难的功能,网上许多的实现方式都是通过将String类型转换为Int32类型来进行判断的,自从对了Clr Via C#这本书以后就对拆装箱操作产生了恐惧,于是就想如果不(或者是减少)通过类型转换的方式去实现会不会更好。

先做个测试,测试一下TextBox几个关键关键事件的触发顺序:

PreviewKeyDown > KeyDown > PreviewTextInput > TextChanged > PreviewKeyUp > KeyUp

  在上面的实践中,在PreviewKeyDownKeydown中都可以捕获到按下的键值,在PreViewTextInput中可以获取到当前输入的字符,在TextChanged里面可以获取到已经发生变化的TextBox的值和对应的Changed(e.Changes),接下来就是对应的KeyUp事件,在测试的时候还有一个TextInput的事件没有触发,不知道怎么回事,不过从字面上理解这个事件貌似也没有什么用处,TextInput事件不知道处于一个什么样的状态。

  通过上面的测试发现可以在PreviewKeyDown对用户按下的键值进行判断,代码如下:

 1         protected override void OnPreviewKeyDown(KeyEventArgs e)
 2         {
 3             if ((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
 4                 (e.Key >= Key.D0 && e.Key <= Key.D9) ||
 5                 e.Key == Key.Back||
 6                 e.Key==Key.Left||e.Key==Key.Right)
 7             {
 8                 if (e.KeyboardDevice.Modifiers != ModifierKeys.None)
 9                 {
10                     e.Handled = true;
11                 }
12             }
13             else
14             {
15                 e.Handled = true;
16             }
17         }

  通过代码可以看出在输入时只允许按下的键值为数字和Backspace,并且不能是组合键。这样就实现了不通过类型转换实现了只能输入数字的功能,在这里多说一点,一般这个功能还需要考虑到粘贴的问题,例如将一段内容从其他地方粘贴到文本框内,这个可以通过DataObject的附加事件Pasting来实现,代码如下:

 1         public NumericTextBox()
 2         {
 3             DataObject.AddPastingHandler(this, Text_Pasting);
 4         }
 5
 6         private void Text_Pasting(object sender, DataObjectPastingEventArgs e)
 7         {
 8             //禁止Pasting
 9             e.CancelCommand();
10         }

  “意外”的是由于在PreviewKeyDown中 对组合键进行了判断,所以就不需要这个Pasting事件了。

  在很多业务需求中需要这个TextBox有个最大值和最小值,我个人的做法是在TextChanged事件中进行判断,这个就没有办法避免类型转换了,代码如下:

 1         protected override void OnTextChanged(TextChangedEventArgs e)
 2         {
 3             if (_isReentry)
 4             {
 5                 SelectionStart = _index;
 6                 return;
 7             }
 8             _isReentry = true;
 9             Int32 temp = 0;
10             if (Int32.TryParse(Text, out temp))
11             {
12                 if (temp > Maximum || temp < Minimum)
13                 {
14                     temp = temp > Maximum ? Maximum : Minimum;
15                     _index = SelectionStart;
16                 }
17                 Text = temp.ToString();
18             }
19             //类型不正确或者超长会导致转换失败
20             else
21             {
22                 Text = Int32.MaxValue.ToString();
23             }
24             _isReentry = false;
25         }

  两个局部变量为:

1         private Int32 _index;  //光标位置
2         private bool _isReentry; //标识TextChanged事件是否重入

  如果有什么更好的想法,欢迎指教。

转载于:https://www.cnblogs.com/noob/p/3515825.html

WPF TextBox只能输入数字相关推荐

  1. WPF TextBox 只能输入数字,并限制输入大小

    /// <summary>/// 文本框文本输入事件/// </summary>private void txt_PreviewTextInput(object sender, ...

  2. 限制文本框(TextBox)只能输入数字(VB6代码)

    在一些要求只允许输入数值的场合,就用得上了. 基本思路是,先在文本框的keyPress事件里过滤键盘输入,再使用子类化将粘贴剪切等剪贴板操作吃掉. 窗体frmMain.frm内代码(窗体包含一个文本框 ...

  3. TextBox只能输入数字

    Asp.net TextBox只能输入数字 <asp:textbox id="TextBox1" οnkeyup="if(isNaN(value))execComm ...

  4. 【WinForm】设置控件里面的所有TextBox只能输入数字

    设置控件里面的所有TextBox只能输入数字 回顾 [WinForm]TextBox只能输入数字 只能输入整数 private static void tb_KeyPress(object sende ...

  5. WPF TextBox 允许输入数字及字母的工具类

    目录 WPF TextBox 允许输入数字及字母的工具类 工具代码 如何使用 WPF TextBox 允许输入数字及字母的工具类 WPF TextBox 仅允许数字.数字及小数点.字母及数字等进行输入 ...

  6. WinForm TextBox 只能输入数字

    在Winform(C#)中要实现限制Textbox只能输入数字,一般的做法就是在按键事件中处理,判断keychar的值.限制只能输入数字,小数点,Backspace,del这几个键.数字0~9所对应的 ...

  7. 【WinForm】TextBox只能输入数字

    只能输入整数 方法一 private void tb_KeyPress(object sender, KeyPressEventArgs e) {//如果输入的不是退格和数字,则屏蔽输入if (!(e ...

  8. Asp.net控制TextBox只能输入数字

    方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 0x20) e.KeyCh ...

  9. Asp.net TextBox只能输入数字

    <asp:textbox id="TextBox1" οnkeyup="if(isNaN(value))execCommand('undo')" runa ...

最新文章

  1. 微型计算机系统外文,微型计算机控系统(单片机控制系统) 毕业论文外文翻译.doc...
  2. matlab滤波仿真
  3. 【深度学习】PyTorch 中的线性回归和梯度下降
  4. hdu 5131 Song Jiang#39;s rank list 【2014ACM/ICPC亚洲区广州站-重现赛】
  5. linux命令:until循环
  6. Core IO学习心得
  7. navigator 携带参数_福州振动时效参数视频,振动时效设备用途
  8. 现实给了梦想多少时间?
  9. java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
  10. 安装php_sqlsrv扩展
  11. 自费访学|计算机专业老师赴加拿大卡尔加里大学
  12. python queue put阻塞_python queue length_queue length_python queue put
  13. cannot be loaded because running scripts is disabled on this system.
  14. Mac 卸载重装 brew
  15. 如何轻松应对述职专题三之演讲
  16. Java——Person类
  17. 富士康服务器主板X58维修,富士康X58 Blood Rage主板BIOS预览
  18. 广东金融2016年计算机类宿舍,广东寝室最好最差的10所大学!没有对比就没有伤害!...
  19. android应用开发-从设计到实现 2-1 设计原理
  20. 2023最新爱蜗影视优码双端影视源码+支持代理/在线支付

热门文章

  1. php+api抖音随机播放视频源码
  2. 简约的蓝色流量卡网站源码
  3. 对dedecms、php168,phpcms、VeryCMS、DiyPage五款开源整站系统的简单评点(
  4. lcc-win32使用指南
  5. Node.js DNS 模块
  6. MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明)
  7. canvas保存为data:image扩展功能的实现
  8. Ubuntu终端(terminal)及Thunderbird邮件客户端常用的快捷键
  9. 15个友好的jQuery 提示框插件
  10. 并查集——小米笔试题求朋友圈个数,分小组个数