Мне нужно создать TextBox только с числами, но я не мог этого сделать.
Я пытался поставить: InputScope = "Numbers", но это работает только на мобильных устройствах.
Также я пробовал на TextChanging это:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
{
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
}
}
Спасибо @CodeCaster, я опубликовал полный ответ.





Вы можете либо запретить любой нечисловой ввод вообще, либо просто отфильтровать цифры в тексте.
Предотвращение нецифрового ввода
Используйте событие BeforeTextChanging:
<TextBox BeforeTextChanging = "TextBox_OnBeforeTextChanging" />
А теперь обработайте вот так:
private void TextBox_OnBeforeTextChanging(TextBox sender,
TextBoxBeforeTextChangingEventArgs args)
{
args.Cancel = args.NewText.Any(c => !char.IsDigit(c));
}
Это выражение LINQ вернет true и, следовательно, Cancel - изменение текста в случае, если во входных данных встретится какой-либо нецифровой символ.
Фильтрация нецифрового ввода
Используйте событие TextChanging:
<TextBox TextChanging = "TextBox_OnTextChanging" />
И поступайте так:
private void TextBox_OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
//Save the position of the selection, to prevent the cursor to jump to the start
int pos = sender.SelectionStart;
sender.Text = new String(sender.Text.Where(char.IsDigit).ToArray());
sender.SelectionStart = pos;
}
Этот запрос LINQ отфильтрует нецифровые символы и создаст новый string только с цифрами на входе.
Предпочтительно использовать TextChanging и BeforeTextChanging, потому что TextChanged возникает слишком поздно, поэтому пользователь будет сбит с толку, увидев символы, временно отображаемые на экране и немедленно исчезающие.
Использование linq для этого отлично.
Обратите внимание, что событие BeforeTextChanging доступно только в контракте API v5 (Windows v10.0.16299.0) и более поздних версиях. Если вместо этого вы работаете с TextChanging, вам следует восстановить (и отрегулировать) текущий выбор. В противном случае вы увидите, как курсор прыгает, создавая очень плохой пользовательский опыт.
Если вы привязываете Text к int, это решение вызывает исключения, потому что пустая строка не преобразуется автоматически в 0. Если вы этого не хотите, вам нужно заменить «» на «0» в TextChanging.
Вы можете сделать что-то еще вместо функции TextBox.Text.Remove, которая является функцией Substring, и также вы должны исправить это, пока они копируют серию символов, которая включает буквы в центре строки: -
private void textBox1_TextChanged(object sender, EventArgs e)
{
var txt = textBox1.Text;
if (System.Text.RegularExpressions.Regex.IsMatch(txt, "[^0-9]"))
{
for (int i = 0; i < txt.Length; i++)
if (!char.IsDigit(txt[i]))
if (i != txt.Length - 1)
{
//If he pasted a letter inclusive string which includes letters in the middle
//Remove the middle character or remove all text and request number as input
//I did the second way
textBox1.Text = "";
break;
}
else
{
//If he just typed a letter in the end of the text
textBox1.Text = txt.Substring(0, txt.Length - 1);
break;
}
}
}
Вот решение O (1) без сопоставления строк
bool textCanceled = false;
private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (!Char.IsDigit((char)e.Key))
textCanceled = true;
else
textCanceled = false;
}
private void TextBox_BeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args)
{
args.Cancel = textCanceled;
}
возможно, придется обрабатывать символ обратного пробела как особый случай
Надежная стратегия решения проблем: 1 Заставить работать. 2 По желанию сделать быстро. Этот ответ кажется обратным: 1 Сделайте это быстро. 2 При желании заставить работать. Это не учитывает вставку текста пользователем с помощью клавиатуры или мыши. Этот предложенный ответ не может быть исправлен, чтобы решить эту проблему.
На основании ответа https://stackoverflow.com/a/52624310/13814517 на этот вопрос.
Если вы хотите также разрешить ввод типа 100,0, у вас может быть проблема с десятичной точкой. так
private void TextBox_OnBeforeTextChanging(TextBox sender,
TextBoxBeforeTextChangingEventArgs args)
{
double tempDouble;
args.Cancel = !(double.TryParse(args.NewText, out tempDouble) | args.NewText == "");
}
Основываясь на принятом решении ответа для текста фильтрация out, если вам нужно использовать событие TextChanged:
private void HexTextBox_TextChanged(object sender, EventArgs e)
{
if (!(sender is TextBox txt))
return;
// Filter out any invalid chars that are typed/pasted and leave the cursor where it was (or reasonably close).
int pos = txt.SelectionStart;
txt.Text = string.Concat(txt.Text.Where(c => "0123456789abcdefABCDEF".IndexOf(c) != -1));
txt.SelectionStart = pos;
}
Это делает так, что кто-то не может вводить нежелательные символы в TextBox. И если они их вставляют, их игнорируют. Например. для приведенного выше, если вы попытаетесь вставить «12 # 45 ^», вы получите «1245» в текстовом поле.
@CodeCaster Это абсолютно не дубликат. Отмеченный вопрос относится к технологии WPF, и решение не применяется в UWP.