使用UWP TextBox.TextChanging来忽略错误的数据

我正在创建一个UWP应用程序,它具有不同的TextBoxes来输入数字。 为确保只能输入数字,我使用TextChanging事件。 遗憾的是,我找不到任何关于如何使用TextChanging来忽略错误输入的文档。

一个TextBox的工作解决方案如下:

string oldText; private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { double temp; if (double.TryParse(sender.Text, out temp) || sender.Text == "") oldText = sender.Text; else { int pos = sender.SelectionStart - 1; sender.Text = oldText; sender.SelectionStart = pos; } } 

使用这个解决方案,我需要为每个TextBox提供一个string oldText ,并为每个TextBox提供一个TextChanging函数或者在函数内部有更多代码。

是否有一种简单的方法可以忽略TextBox.TextChanging事件中的“错误”输入?

在Romasz链接的第一个评论的帮助下,我提出了这个解决方案:

 private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { double dtemp; if (!double.TryParse(sender.Text, out dtemp) && sender.Text != "") { int pos = sender.SelectionStart - 1; sender.Text = sender.Text.Remove(pos, 1); sender.SelectionStart = pos; } } 

除非选择输入值的一部分然后输入错误的字符,否则此操作非常正常。

编辑:我改进了以上版本以使用正则表达式。 所以现在我可以检查应该允许输入的内容:

 private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { if (!Regex.IsMatch(sender.Text, "^\\d*\\.?\\d*$") && sender.Text != "") { int pos = sender.SelectionStart - 1; sender.Text = sender.Text.Remove(pos, 1); sender.SelectionStart = pos; } } 

尝试使用PreviewTextInput事件,该事件传递具有Handled属性的TextCompositionEventArgs,该属性可用于路由事件以通过设置Handled = true来暂停基本控件的实现。

自Windows 10 Fall Creators Update(Build 16299)以来,有一个textBox_BeforeTextChanging事件。 TextBoxBeforeTextChangingEventArgs具有取消属性以取消textchange。 试试这个

  private void textBox_BeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args) { bool result = int.TryParse(args.NewText, out int intResult); if (result == false || args.NewText.Contains(" ")) { args.Cancel = true; } } 

为什么他仍然接受空间,所以我必须另外检查它们。