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
相关产品推荐
相关产品推荐

