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

WPF PreviewTextInput验证小数时末尾小数点被丢弃的问题

解决WPF TextBox PreviewTextInput末尾小数点不显示问题

你遇到的问题是,使用PreviewTextInput验证十进制数字时,在字符串末尾输入小数点,尽管正则匹配通过,但小数点不会显示在TextBox中。

核心原因

最常见的触发场景是TextBox绑定了decimal类型的属性:当输入类似123.的字符串时,它无法转换为有效的decimal值,绑定引擎会触发验证失败,自动将Text回滚到之前的有效值(比如123),导致小数点看似被丢弃。

若未使用绑定,极少数情况下可能是WPF默认文本处理逻辑的细节问题,但这种情况概率极低。

解决方案

方案1:调整绑定策略(推荐)

如果使用MVVM绑定,有两种调整方式:

  • 改用string类型属性存储输入值:在用户提交时再转换为decimal,允许输入过程中的中间状态(如123.)保留:
// ViewModel中的属性
private string _amountText;
public string AmountText
{
    get => _amountText;
    set => SetProperty(ref _amountText, value);
}

// 提交时执行转换验证
public void Submit()
{
    if (decimal.TryParse(AmountText, out decimal amount))
    {
        // 处理有效金额逻辑
    }
    else
    {
        // 提示用户输入无效
    }
}
  • 延迟数据源更新时机:保持decimal属性不变,修改绑定的UpdateSourceTrigger为LostFocus,仅当TextBox失去焦点时才更新数据源,输入过程中的中间状态不会触发验证:
<TextBox x:Name="AmountTextBox"
         Text="{Binding Amount, UpdateSourceTrigger=LostFocus}"
         PreviewTextInput="AmountTextBox_PreviewTextInput"/>

方案2:优化输入处理逻辑

如果不使用绑定,或需要实时验证,可补充处理按键事件并微调正则:

private void AmountTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    TextBox t = sender as TextBox;
    string newText = t.Text.Insert(t.SelectionStart, e.Text);
    // 正则调整为允许开头小数点(如".12"),同时保留末尾小数点的匹配
    Regex regex = new Regex(@"^[0-9]{0,12}(?:\.[0-9]{0,2})?$");
    e.Handled = !regex.IsMatch(newText);
}

// 补充处理退格、删除键,确保文本编辑正常
private void AmountTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Back || e.Key == Key.Delete)
    {
        e.Handled = false;
    }
}

同时确保TextBox的AcceptsReturn属性设为False,避免意外换行干扰。

内容的提问来源于stack exchange,提问作者Digital Camel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:32:25