Я хочу принять цифры и десятичную точку, но без знака.
Я рассмотрел примеры использования элемента управления NumericUpDown для Windows Forms и этот пример пользовательского элемента управления NumericUpDown от Microsoft . Но до сих пор кажется, что NumericUpDown (поддерживается WPF или нет) не собирается предоставлять функциональность, которую я хочу. При разработке моего приложения никто в здравом уме не захочет возиться со стрелками. Они не имеют никакого практического смысла в контексте моего приложения.
Поэтому я ищу простой способ заставить стандартный WPF TextBox принимать только те символы, которые мне нужны. Это возможно? Это практично?
double.TryParse()
, вероятно, будет реализовано с таким же количеством строк и будет более гибким.Обработчик событий выполняет предварительный просмотр ввода текста. Здесь регулярное выражение соответствует вводу текста только в том случае, если оно не является числом, и тогда оно не вносится в текстовое поле ввода.
Если вы хотите только буквы, замените регулярное выражение на
[^a-zA-Z]
.XAML
ФАЙЛ XAML.CS
источник
Я использовал кое-что из того, что уже было здесь, и добавил свой собственный поворот, используя поведение, чтобы мне не приходилось распространять этот код в тоннах просмотров ...
Вот соответствующий код представления:
источник
Это улучшенное решение ответа WilP . Мои улучшения:
EmptyValue
свойство, если пустая строка не подходитИспользование довольно просто:
источник
MaxLength
ваше условие(this.MaxLength == 0 || text.Length <= this.MaxLength)
всегда возвращаетсяfalse
при тестировании нового текста. Это должно быть лучше,(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
так как вы установилиint.MinValue
значение по умолчанию дляMaxLength
.UpdateSourceTrigger=PropertyChanged
привязку. Любая идея , как получить этот код на работу при измененииUpdateSourceTrigger
установлено значениеPropertyChanged
? Спасибо, что поделились этим кодом.Вот очень простой и легкий способ сделать это с помощью MVVM.
Свяжите свой textBox с целочисленным свойством в модели представления, и это будет работать как драгоценный камень ... он даже покажет проверку, когда в текстовое поле введено нецелое число.
Код XAML:
Посмотреть код модели:
источник
long
наfloat
, но это не сработало с немедленной проверкой. Я добавилUpdateSourceTrigger="PropertyChanged"
к привязке, чтобы она выполняла проверку при вводе каждого символа и больше не могла набирать '.' в TextBox, если не было недопустимого символа (пришлось ввести «1x.234», а затем удалить «х»). Он также чувствует себя немного вялым в этом режиме. Похоже, это используетсяSystem.Number.ParseSingle()
для выполнения работы, поэтому он принимает различные обозначения.Добавьте в ПРАВИЛО ВАЛИДАЦИИ, чтобы при изменении текста проверялось, чтобы определить, являются ли данные числовыми, и, если это так, позволяет продолжить обработку, а если нет, то предлагает пользователю принять в этом поле только числовые данные.
Подробнее читайте в валидации в Windows Presentation Foundation
источник
double
и он уже предоставляет вам стандартную проверку.У расширенного набора инструментов WPF есть один: NumericUpDown
источник
NumericUpDown
сейчас устарел. вы можете использоватьDecimalUpDown
из обновленного инструментария Extended WPF Toolkit ™ Community EditionМожет также просто реализовать правило проверки и применить его к TextBox:
С реализацией правила следующим образом (используя тот же Regex, как предложено в других ответах):
источник
Здесь у меня есть простое решение, вдохновленное ответом Рэя . Этого должно быть достаточно для идентификации любой формы номера.
Это решение также можно легко изменить, если вам нужны только положительные числа, целочисленные значения или значения с точностью до максимального количества десятичных знаков и т. Д.
Как указано в ответе Рэя , вам нужно сначала добавить
PreviewTextInput
событие:Затем поместите в код следующее:
источник
Я позволил числовые цифры клавиатуры и Backspace:
источник
var keyEnum = (System.Windows.Input.Key) e.Key; e.Handled = !(keyEnum >= System.Windows.Input.Key.D0 && keyEnum <= System.Windows.Input.Key.D9 || keyEnum >= System.Windows.Input.Key.NumPad0 && keyEnum <= System.Windows.Input.Key.NumPad9 || keyEnum == System.Windows.Input.Key.Back);
Я буду считать, что:
Ваш TextBox, для которого вы хотите разрешить только числовой ввод, имеет свойство Text, изначально установленное в какое-то допустимое числовое значение (например, 2.7172).
Ваше текстовое поле является дочерним элементом вашего главного окна
Ваше главное окно класса Window1
Ваше имя в TextBox является числовым
Основная идея:
Добавить:
private string previousText;
в свой класс главного окна (Window1)Добавьте:
previousText = numericTB.Text;
в ваш главный конструктор оконСоздайте обработчик для события numericTB.TextChanged, чтобы он был примерно таким:
При этом для предыдущего тега будет установлено значение numericTB.Text, пока оно действительно, и для numericTB.Text будет установлено его последнее действительное значение, если пользователь пишет что-то, что вам не нравится. Конечно, это просто базовая идея, и она просто «устойчива к идиотам», а не «защищена от идиотов». Это не относится к случаю, когда пользователь, например, путается с пробелами. Итак, вот полное решение, которое я считаю «доказательством идиота», и если я ошибаюсь, скажите мне:
Содержимое вашего файла Window1.xaml:
Содержимое вашего файла Window.xaml.cs:
И это все. Если у вас много TextBox-ов, то я рекомендую создать CustomControl, который наследуется от TextBox, чтобы вы могли обернуть предыдущиеText и numericTB_TextChanged в отдельный файл.
источник
Это единственный необходимый код:
Это позволяет только вводить числа в текстовое поле.
Чтобы разрешить десятичную точку или знак минус, вы можете изменить регулярное выражение на
[^0-9.-]+
.источник
Если вы не хотите писать много кода для выполнения основной функции (я не знаю, почему люди делают длинные методы), вы можете просто сделать это:
Добавить пространство имен:
В XAML установите свойство TextChanged:
В WPF под методом txt1_TextChanged добавьте
Regex.Replace
:источник
Другой подход будет использовать прикрепленное поведение, я реализовал свой кастом класс TextBoxHelper , который можно использовать в текстовых полях по всему моему проекту. Потому что я полагал, что подписка на события для каждого текстового поля и в каждом отдельном файле XAML для этой цели может занимать много времени.
Реализованный мной класс TextBoxHelper имеет следующие особенности:
Вот реализация класса TextBoxHelper:
И вот несколько примеров его легкого использования:
Или
Обратите внимание, что мой TextBoxHelper находится в псевдониме viewHelpers xmlns.
Я надеюсь, что эта реализация облегчит работу некоторых других :)
источник
в предпросмотре события keydown текстового поля.
источник
источник
.
, так какe.Text
возвращает только последний введенный символ и точка не пройдетIsDigit
проверку.Для тех, кто ищет быструю и очень простую реализацию проблемы такого типа, используя только целые и десятичные числа, добавьте в свой файл XAML
PreviewTextInput
свойство,TextBox
а затем в свой файл xaml.cs:Излишне проверять всю строку каждый раз, если, как уже упоминали другие, вы делаете что-то с научной нотацией (хотя, если вы добавляете определенные символы, такие как 'e', простое регулярное выражение, добавляющее символы / символы, действительно просто и проиллюстрировано другими ответами). Но для простых значений с плавающей точкой этого решения будет достаточно.
Написано как однострочный с лямбда-выражением:
источник
Мы можем сделать проверку измененного события в текстовом поле. Следующая реализация запрещает ввод данных нажатием клавиши, кроме чисел и одной десятичной точки.
источник
Как насчет этого? Хорошо работает для меня. Надеюсь, я не пропустил ни одного крайнего случая ...
источник
В Windows Forms это было легко; Вы можете добавить событие для KeyPress, и все работает легко. Однако в WPF этого события нет. Но есть гораздо более простой способ для этого.
WPF TextBox имеет событие TextChanged, которое является общим для всего. Это включает в себя вставку, ввод текста и все, что может прийти в голову.
Так что вы можете сделать что-то вроде этого:
XAML:
КОД позади:
Это также принимает
.
, если вы не хотите этого, просто удалите его изregex
оператора, чтобы быть@[^\d]
.Примечание : это событие может использоваться во многих TextBox'ах, так как оно использует
sender
Text объекта. Вы пишете событие только один раз и можете использовать его для нескольких TextBox'ов.источник
Теперь я знаю, что на этот вопрос принят ответ , но лично я нахожу его немного запутанным и считаю, что это должно быть проще, чем это. Поэтому я постараюсь продемонстрировать, как я заставил его работать как можно лучше:
В Windows Forms есть событие,
KeyPress
которое отлично подходит для такого рода задач. Но это не существует в WPF , поэтому вместо этого мы будем использоватьPreviewTextInput
событие. Кроме того , для проверки, я считаю , можно использоватьforeach
в цикле черезtextbox.Text
и проверить , если он соответствует ;) состояние, но , честно говоря, это то , что регулярные выражения для.Еще одна вещь, прежде чем мы погрузимся в священный кодекс . Для запуска события можно сделать две вещи:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
случае формы (в которой находится textBox):textBox.PreviewTextInput += onlyNumeric;
Я думаю, что второй метод лучше, потому что в подобных ситуациях вам, скорее всего, потребуется применить одно и то же условие (
regex
) к нескольким,TextBox
и вы не захотите повторяться!,Наконец, вот как вы это сделаете:
источник
Вот моя версия этого. Он основан на базовом
ValidatingTextBox
классе, который просто отменяет то, что было сделано, если он не «допустим». Он поддерживает вставку, вырезание, удаление, возврат, +, - и т. Д.Для 32-разрядного целого числа существует класс Int32TextBox, который просто сравнивается с int. Я также добавил классы проверки с плавающей запятой.
Примечание 1: При использовании привязки WPF необходимо убедиться, что вы используете класс, который соответствует связанному типу свойства, в противном случае это может привести к странным результатам.
Примечание 2. При использовании классов с плавающей точкой с привязкой WPF убедитесь, что привязка использует текущую культуру для соответствия методу TryParse, который я использовал.
источник
Вот библиотека для числового ввода в WPF
У него есть свойства как
NumberStyles
иRegexPattern
для проверки.Подклассы WPF
TextBox
источник
Использование:
источник
Я работал с несвязанным блоком для простого проекта, над которым я работал, поэтому я не мог использовать стандартный подход связывания. Следовательно, я создал простой хак, который другие могут найти весьма удобным, просто расширив существующий элемент управления TextBox:
Очевидно, что для плавающего типа вы захотите проанализировать его как float и так далее. Применяются те же принципы.
Затем в файл XAML необходимо включить соответствующее пространство имен:
После этого вы можете использовать его как обычный элемент управления:
источник
После использования некоторых решений здесь в течение некоторого времени я разработал свое собственное решение, которое хорошо работает для моей установки MVVM. Обратите внимание, что он не такой динамичный, как некоторые другие, в том смысле, что он по-прежнему позволяет пользователям вводить ошибочные символы, но он блокирует их от нажатия кнопки и, таким образом, выполнения каких-либо действий. Это хорошо согласуется с моей темой «закрашивание кнопок», когда действия не могут быть выполнены.
У меня есть,
TextBox
что пользователь должен ввести количество страниц документа для печати:... с этим обязательным свойством:
У меня также есть кнопка:
... с этой привязкой команды:
И тогда есть метод
SetNumberOfPages()
, но это неважно для этой темы. В моем случае это работает хорошо, потому что мне не нужно добавлять какой-либо код в файл кода code View, и это позволяет мне контролировать поведение с помощьюCommand
свойства.источник
При проверке числового значения вы можете использовать функцию VisualBasic.IsNumeric .
источник
В приложении WPF вы можете справиться с этим, обработав
TextChanged
событие:источник
Для разработчиков, которые хотят, чтобы их текстовые поля принимали только неподписанные числа, такие как порты сокетов и т. Д.
WPF
C #
источник
65535
. Если он больше, то это не допустимый порт. Кроме того, установкаTextBox.MaxLength
to5
поможет либо программно, либо в XAML .Вот что я хотел бы использовать, чтобы получить текстовое поле WPF, которое принимает цифры и десятичную точку:
Поместите код в новый файл класса, добавьте
в верхней части файла и построить решение. Элемент управления numericTextBox появится в верхней части панели инструментов.
источник