You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:02:41