zoukankan      html  css  js  c++  java
  • 【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类似,但是要稍微简单一点。

    附代码,跟大家分享一下:)

    https://files.cnblogs.com/RMay/WpfInputs.zip

  • 相关阅读:
    pycharm 安装第三方库,出现错误: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visual studio.com/visual-cpp-build-tools
    c# 开发常用小方法
    [LeetCode]28. 实现 strStr()
    [LeetCode]27. 移除元素
    [LeetCode]21. 合并两个有序链表
    [LeetCode]20. 有效的括号
    [LeetCode]14. 最长公共前缀
    [LeetCode]13. 罗马数字转整数
    [LeetCode]9. 回文数
    [LeetCode]2. 两数相加
  • 原文地址:https://www.cnblogs.com/RMay/p/2004216.html
Copyright © 2011-2022 走看看