WPF TextBox正则验证问题:选中内容无法输入新数字替换
修复WPF TextBox选中内容替换时的数字验证问题
你的问题出在NumberValidationTextBox方法计算预期文本的逻辑上——当前代码直接将输入文本追加到原文本末尾,完全没考虑选中内容会被替换的场景。比如选中123.23后输入5,代码会错误地计算出123.235,不符合正则规则,导致输入被拦截。
只需要修改NumberValidationTextBox方法,加入对选中区域的处理,计算出替换后的真实预期文本即可:
public void NumberValidationTextBox(object sender, TextCompositionEventArgs e) { Regex regex = new Regex(@"^-?[0-9]*[\.,]?[0-9]?[0-9]?$"); var textBox = sender as TextBox; if (textBox == null) return; // 计算替换选中内容后的实际预期文本 var currentText = textBox.Text; int selectionStart = textBox.SelectionStart; int selectionLength = textBox.SelectionLength; string futureText = currentText.Remove(selectionStart, selectionLength).Insert(selectionStart, e.Text); e.Handled = !regex.IsMatch(futureText); }
修改说明:
- 先获取TextBox的选中起始位置
SelectionStart和选中长度SelectionLength - 通过
Remove删除选中的内容,再用Insert把输入的文本放到选中位置,得到真正的预期输入结果 - 原有的正则验证逻辑保持不变,只是验证的目标文本更符合实际操作场景
OnTextChanged方法的逻辑无需改动,它处理逗号转小数点和光标位置的功能依然有效。
内容的提问来源于stack exchange,提问作者online123
相关产品推荐
相关产品推荐

