【WPF】自定义金额输入控件CurrencyEditor和限制输入控件FieldTextBox
原来没有考虑到+/-输入的情况,已修改
由于项目的需要,我们在某些场合下需要对输入做限制,例如金额,需要靠右对齐,需要显示货币符号,需要显示分隔符号等等。相信大家都碰到过这种需求。上网找这种控件也很难找,要么就是收费的,要么就是不太符合国人的习惯。例如,原来用过一个第三方NetAdvantage控件,但是它是严格按照货币的格式化方式来格式化的,不适合国人的金额格式习惯。因为国人的金额格式习惯是类似于 $#,###,###.##,但是某些币种,小数点是',',分组符号是'.',是反过来的,很容易让人看错;而某些币种的输入方式是从右往左,就更不适应了。
因此,自己写了一个金额输入控件CurrencyEditor,可以根据不同的语言显示不同的货币符号和限制小数位数。没有直接用.Net的格式化decimal,而是自己调用.Net格式化之后,再处理为“货币符号+金额值”的形式。
CurrencyEditor继承自TextBox,要点是在OnTextChanged中去解析文本是否合法,并且将文本格式化,然后设置光标的位置。其实TextBox还有一个TextInput事件,但是在这个事件中处理的问题在于,复制粘贴操作不会触发TextInput,会导致用户可以用复制粘贴的方式录入非法文本。其次,就是在OnSelectionChanged中去检查光标的位置,要保证用户录入的舒适性。在OnPreviewKeyDown中处理一些非法录入,和控制光标位置,例如按下'.'直接跳到小数点之后,同时控制用户通过DEL和Backspace不会去删除掉货币符号和小数点。详情还是见代码吧,注释很详尽。
另外一个控件是限制输入的FieldTextBox,限制有两方面,一个是输入的内容,有Text和Digit两种。Text可以任意输入,Digit只能输入数字(例如,在输入卡号的时候很有用)。另一个是限制输入的字节长度,这个限制在输入一个报文中,按照字节有长度限制的字段时很有用。WPF的TextBox虽然有一个MaxLength,但是限制的是字符长度。例如,“我”是两个字节,却只是一个字符。FieldTextBox的处理逻辑与CurrencyEditor类似,但是要稍微简单一点。
附代码,跟大家分享一下:)