WPF TextBox只能输入数字
关于WPF TextBox只能输入数字并不是一个很难的功能,网上许多的实现方式都是通过将String类型转换为Int32类型来进行判断的,自从对了Clr Via C#这本书以后就对拆装箱操作产生了恐惧,于是就想如果不(或者是减少)通过类型转换的方式去实现会不会更好。
先做个测试,测试一下TextBox几个关键关键事件的触发顺序:
PreviewKeyDown > KeyDown > PreviewTextInput > TextChanged > PreviewKeyUp > KeyUp
在上面的实践中,在PreviewKeyDown和Keydown中都可以捕获到按下的键值,在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只能输入数字相关推荐
- WPF TextBox 只能输入数字,并限制输入大小
/// <summary>/// 文本框文本输入事件/// </summary>private void txt_PreviewTextInput(object sender, ...
- 限制文本框(TextBox)只能输入数字(VB6代码)
在一些要求只允许输入数值的场合,就用得上了. 基本思路是,先在文本框的keyPress事件里过滤键盘输入,再使用子类化将粘贴剪切等剪贴板操作吃掉. 窗体frmMain.frm内代码(窗体包含一个文本框 ...
- TextBox只能输入数字
Asp.net TextBox只能输入数字 <asp:textbox id="TextBox1" οnkeyup="if(isNaN(value))execComm ...
- 【WinForm】设置控件里面的所有TextBox只能输入数字
设置控件里面的所有TextBox只能输入数字 回顾 [WinForm]TextBox只能输入数字 只能输入整数 private static void tb_KeyPress(object sende ...
- WPF TextBox 允许输入数字及字母的工具类
目录 WPF TextBox 允许输入数字及字母的工具类 工具代码 如何使用 WPF TextBox 允许输入数字及字母的工具类 WPF TextBox 仅允许数字.数字及小数点.字母及数字等进行输入 ...
- WinForm TextBox 只能输入数字
在Winform(C#)中要实现限制Textbox只能输入数字,一般的做法就是在按键事件中处理,判断keychar的值.限制只能输入数字,小数点,Backspace,del这几个键.数字0~9所对应的 ...
- 【WinForm】TextBox只能输入数字
只能输入整数 方法一 private void tb_KeyPress(object sender, KeyPressEventArgs e) {//如果输入的不是退格和数字,则屏蔽输入if (!(e ...
- Asp.net控制TextBox只能输入数字
方法一: private void tBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 0x20) e.KeyCh ...
- Asp.net TextBox只能输入数字
<asp:textbox id="TextBox1" οnkeyup="if(isNaN(value))execCommand('undo')" runa ...
最新文章
- 微型计算机系统外文,微型计算机控系统(单片机控制系统) 毕业论文外文翻译.doc...
- matlab滤波仿真
- 【深度学习】PyTorch 中的线性回归和梯度下降
- hdu 5131 Song Jiang#39;s rank list 【2014ACM/ICPC亚洲区广州站-重现赛】
- linux命令:until循环
- Core IO学习心得
- navigator 携带参数_福州振动时效参数视频,振动时效设备用途
- 现实给了梦想多少时间?
- java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
- 安装php_sqlsrv扩展
- 自费访学|计算机专业老师赴加拿大卡尔加里大学
- python queue put阻塞_python queue length_queue length_python queue put
- cannot be loaded because running scripts is disabled on this system.
- Mac 卸载重装 brew
- 如何轻松应对述职专题三之演讲
- Java——Person类
- 富士康服务器主板X58维修,富士康X58 Blood Rage主板BIOS预览
- 广东金融2016年计算机类宿舍,广东寝室最好最差的10所大学!没有对比就没有伤害!...
- android应用开发-从设计到实现 2-1 设计原理
- 2023最新爱蜗影视优码双端影视源码+支持代理/在线支付
热门文章
- php+api抖音随机播放视频源码
- 简约的蓝色流量卡网站源码
- 对dedecms、php168,phpcms、VeryCMS、DiyPage五款开源整站系统的简单评点(
- lcc-win32使用指南
- Node.js DNS 模块
- MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明)
- canvas保存为data:image扩展功能的实现
- Ubuntu终端(terminal)及Thunderbird邮件客户端常用的快捷键
- 15个友好的jQuery 提示框插件
- 并查集——小米笔试题求朋友圈个数,分小组个数