如何在WinUI中实现仅支持正负小数输入的自定义TextBox?
在WinUI中实现仅支持正负小数输入的自定义TextBox
WinUI确实没有WPF里的PreviewTextInput这类提前拦截输入的事件,但可以用TextChanging事件替代——它会在文本实际更新前触发,能直接拦截非法输入。
实现步骤
- 订阅
TextChanging事件,通过TextBoxTextChangingEventArgs.Cancel属性取消不符合规则的输入 - 用正则表达式验证输入文本是否为合法的正负小数
代码示例
创建自定义TextBox类,内置验证逻辑:
using System.Text.RegularExpressions; using Microsoft.UI.Xaml.Controls; public class DecimalTextBox : TextBox { // 正则规则:允许空、负号、整数、带小数点的正负小数(包括.开头或结尾的情况) private readonly Regex _validDecimalRegex = new Regex(@"^(-?)(\d+(\.\d*)?|\.\d+)?$"); public DecimalTextBox() { TextChanging += DecimalTextBox_TextChanging; } private void DecimalTextBox_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { // 验证当前输入后的文本是否合法 if (!_validDecimalRegex.IsMatch(sender.Text)) { args.Cancel = true; } } }
扩展调整
- 如果需要限制小数位数,比如最多2位,修改正则为:
@"^(-?)(\d+(\.\d{1,2})?|\.\d{1,2})?$" - 如果不允许空输入,可以在验证时额外判断:
if (string.IsNullOrWhiteSpace(sender.Text) || !_validDecimalRegex.IsMatch(sender.Text)) - 该逻辑同时处理键盘输入和粘贴操作,因为粘贴会触发
TextChanging事件
内容的提问来源于stack exchange,提问作者SANJEEV PRATAP Singh
相关产品推荐
相关产品推荐

