Estoy buscando aceptar dígitos y el punto decimal, pero ningún signo.
He mirado ejemplos usando el control NumericUpDown para Windows Forms, y este ejemplo de un control personalizado NumericUpDown de Microsoft . Pero hasta ahora parece que NumericUpDown (compatible con WPF o no) no va a proporcionar la funcionalidad que quiero. Por la forma en que está diseñada mi aplicación, nadie en su sano juicio querrá meterse con las flechas. No tienen ningún sentido práctico, en el contexto de mi solicitud.
Así que estoy buscando una manera simple de hacer que un cuadro de texto WPF estándar acepte solo los caracteres que quiero. es posible? ¿Es práctico?
double.TryParse()
probablemente se implementaría con el mismo número de líneas y sería más flexible.El controlador de eventos está previsualizando la entrada de texto. Aquí una expresión regular coincide con la entrada de texto solo si no es un número, y luego no se hace en el cuadro de texto de entrada.
Si solo desea letras, reemplace la expresión regular como
[^a-zA-Z]
.XAML
ARCHIVO XAML.CS
fuente
Usé algo de lo que ya estaba aquí y le di mi propio toque usando un comportamiento para no tener que propagar este código a través de un montón de Vistas ...
Aquí está el código de vista relevante:
fuente
Esta es una solución mejorada de la respuesta de WilP . Mis mejoras son:
EmptyValue
Propiedad agregada , si la cadena vacía es inapropiadaEl uso es bastante sencillo:
fuente
MaxLength
condición, su condición(this.MaxLength == 0 || text.Length <= this.MaxLength)
vuelve siemprefalse
al probar el nuevo texto. Esto debería ser mejor(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
ya que estableceint.MinValue
como valor predeterminado paraMaxLength
.UpdateSourceTrigger=PropertyChanged
al enlace. ¿Alguna idea de cómo hacer que este código funcione cuando se cambia laUpdateSourceTrigger
configuraciónPropertyChanged
? Gracias por compartir este código.Aquí hay una manera muy simple y fácil de hacer esto usando MVVM.
Vincula tu textBox con una propiedad de entero en el modelo de vista, y esto funcionará como una gema ... incluso mostrará la validación cuando se ingrese un no entero en el cuadro de texto.
Código XAML:
Ver código del modelo:
fuente
long
afloat
, pero no funcionó del todo bien con la validación inmediata. AgreguéUpdateSourceTrigger="PropertyChanged"
el enlace, por lo que realizaría la validación a medida que se escribía cada carácter y ya no podría escribir un '.' en el cuadro de texto a menos que haya un carácter ilegal presente (tuvo que escribir "1x.234" y luego eliminar la 'x'). También se siente un poco lento en este modo. Esto parece usarseSystem.Number.ParseSingle()
para hacer el trabajo, por lo que acepta una variedad de anotaciones.Agregue una REGLA DE VALIDACIÓN para que cuando el texto cambie, verifique si los datos son numéricos y, si lo es, permite que continúe el procesamiento y, si no es así, le indica al usuario que solo se aceptan datos numéricos en ese campo.
Leer más en Validación en Windows Presentation Foundation
fuente
double
y eso ya le proporciona una validación estándar.El kit de herramientas extendido de WPF tiene uno: NumericUpDown
fuente
NumericUpDown
ahora está obsoleto. puede usarDecimalUpDown
desde el kit de herramientas actualizado Extended WPF Toolkit ™ Community EditionTambién podría simplemente implementar una regla de validación y aplicarla al TextBox:
Con la implementación de la regla de la siguiente manera (usando el mismo Regex propuesto en otras respuestas):
fuente
Aquí tengo una solución simple inspirada en la respuesta de Ray . Esto debería ser suficiente para identificar cualquier forma de número.
Esta solución también se puede modificar fácilmente si solo desea números positivos, valores enteros o valores precisos para un número máximo de decimales, etc.
Como se sugiere en la respuesta de Ray , primero debe agregar un
PreviewTextInput
evento:Luego ponga lo siguiente en el código detrás:
fuente
Permití números de teclado numérico y retroceso:
fuente
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);
Asumiré que:
Su TextBox para el que desea permitir la entrada numérica solo tiene su propiedad Text inicialmente establecida en algún valor numérico válido (por ejemplo, 2.7172).
Tu Textbox es hijo de tu ventana principal
Su ventana principal es de clase Window1
Su nombre de TextBox es numericTB
Idea básica:
Agregar:
private string previousText;
a su clase de ventana principal (Window1)Agregue:
previousText = numericTB.Text;
a su constructor de ventana principalCree un controlador para el evento numericTB.TextChanged para que sea así:
Esto mantendrá la configuración de anteriorText a numericTB.Text siempre que sea válido, y establecerá numericTB.Text en su último valor válido si el usuario escribe algo que no le gusta. Por supuesto, esto es solo una idea básica, y es simplemente "resistente a los idiotas", no "a prueba de idiotas". No maneja el caso en el que el usuario se mete con espacios, por ejemplo. Así que aquí hay una solución completa que creo que es "a prueba de idiotas", y si me equivoco, díganme:
Contenido de su archivo Window1.xaml:
Contenido de su archivo Window.xaml.cs:
Y eso es. Si tiene muchos TextBoxes, le recomiendo crear un CustomControl que herede de TextBox, para que pueda envolver anteriorText y numericTB_TextChanged en un archivo separado.
fuente
Este es el único código necesario:
Esto solo permite ingresar números en el cuadro de texto.
Para permitir un punto decimal o un signo menos, puede cambiar la expresión regular a
[^0-9.-]+
.fuente
Si no desea escribir mucho código para hacer una función básica (no sé por qué la gente hace métodos largos), puede hacer esto:
Añadir espacio de nombres:
En XAML, establezca una propiedad TextChanged:
En WPF bajo el método txt1_TextChanged, agregue
Regex.Replace
:fuente
Otro enfoque será usar un comportamiento adjunto, implementé mi clase personalizada TextBoxHelper , que se puede usar en cuadros de texto en todo mi proyecto. Porque pensé que suscribirse a los eventos para cada cuadro de texto y en cada archivo XAML individual para este propósito puede llevar mucho tiempo.
La clase TextBoxHelper que implementé tiene estas características:
Aquí está la implementación de la clase TextBoxHelper:
Y aquí hay un ejemplo de su fácil uso:
O
Tenga en cuenta que mi TextBoxHelper reside en el alias viewHelpers xmlns.
Espero que esta implementación facilite el trabajo de otros :)
fuente
en la vista previa del evento keydown del cuadro de texto.
fuente
fuente
.
, ya quee.Text
solo devuelve el último carácter de entrada y un punto fallará laIsDigit
verificación.Para aquellos que buscan una implementación rápida y muy simple para este tipo de problema usando solo enteros y decimales, agregue una
PreviewTextInput
propiedad a su archivo XAMLTextBox
y luego en su archivo xaml.cs use:Es algo redundante seguir revisando toda la cadena cada vez, a menos que, como otros han mencionado, esté haciendo algo con notación científica (aunque, si está agregando ciertos caracteres como 'e', una expresión regular simple que agrega símbolos / caracteres es realmente simple e ilustrado en otras respuestas). Pero para valores simples de coma flotante, esta solución será suficiente.
Escrito como una línea con una expresión lambda:
fuente
Podemos hacer la validación en el evento de cambio de cuadro de texto. La siguiente implementación evita la entrada de teclas que no sean numéricas y un punto decimal.
fuente
¿Qué tal esto? Funciona bien para mi Espero no haberme perdido ningún caso de borde ...
fuente
En Windows Forms fue fácil; puedes agregar un evento para KeyPress y todo funciona fácilmente. Sin embargo, en WPF ese evento no está allí. Pero hay una manera mucho más fácil de hacerlo.
El TextBox de WPF tiene el evento TextChanged que es general para todo. Incluye pegar, escribir y lo que sea que se te ocurra.
Entonces puedes hacer algo como esto:
XAML:
CÓDIGO DETRÁS:
Esto también acepta
.
, si no lo desea, simplemente elimínelo de laregex
declaración@[^\d]
.Nota : Este evento se puede usar en muchos TextBox, ya que usa el
sender
Texto del objeto. Solo escribe el evento una vez y puede usarlo para varios TextBox.fuente
Ahora sé que esta pregunta tiene una respuesta aceptada , pero personalmente, me resulta un poco confusa y creo que debería ser más fácil que eso. Así que intentaré demostrar cómo conseguí que funcione lo mejor que pueda:
En Windows Forms , hay un evento llamado
KeyPress
que es perfectamente bueno para este tipo de tarea. Pero eso no existe en WPF , por lo tanto, utilizaremos elPreviewTextInput
evento. Además, para la validación, creo que se puede usar aforeach
para recorrertextbox.Text
y verificar si coincide ;) la condición, pero honestamente, para eso están las expresiones regulares .Una cosa más antes de sumergirnos en el código sagrado . Para que el evento sea despedido, se pueden hacer dos cosas:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
caso del formulario (en el que se encuentra el cuadro de texto):textBox.PreviewTextInput += onlyNumeric;
¡Creo que el segundo método es mejor porque en situaciones como esta, se le requerirá que aplique la misma condición (
regex
) a más de unoTextBox
y no quiera repetirlo! .Finalmente, así es como lo harías:
fuente
Aquí está mi versión de la misma. Se basa en una base
ValidatingTextBox
clase que simplemente deshace lo que se ha hecho si no es "válido". Es compatible con pegar, cortar, eliminar, retroceso, +, - etc.Para un entero de 32 bits, hay una clase Int32TextBox que solo se compara con un int. También he agregado clases de validación de coma flotante.
Nota 1: Al usar el enlace WPF, debe asegurarse de usar la clase que se ajuste al tipo de propiedad enlazado, de lo contrario, puede dar lugar a resultados extraños.
Nota 2: Cuando use clases de punto flotante con enlace WPF, asegúrese de que el enlace use la cultura actual para que coincida con el método TryParse que he usado.
fuente
Aquí hay una biblioteca para entrada numérica en WPF
Tiene propiedades como
NumberStyles
yRegexPattern
para validación.Subclases WPF
TextBox
fuente
Utilizar:
fuente
Estaba trabajando con un cuadro independiente para un proyecto simple en el que estaba trabajando, por lo que no pude usar el enfoque de enlace estándar. En consecuencia, creé un truco simple que otros podrían encontrar bastante útil simplemente extendiendo el control TextBox existente:
Obviamente, para un tipo flotante, desearía analizarlo como flotante, etc. Se aplican los mismos principios.
Luego, en el archivo XAML, debe incluir el espacio de nombres relevante:
Después de eso, puede usarlo como control regular:
fuente
Después de usar algunas de las soluciones aquí por algún tiempo, desarrollé una propia que funciona bien para mi configuración MVVM. Tenga en cuenta que no es tan dinámico como algunos de los otros en el sentido de que todavía permite a los usuarios ingresar caracteres erróneos, pero les impide presionar el botón y, por lo tanto, hacer cualquier cosa. Esto va bien con mi tema de botones en gris cuando no se pueden realizar acciones.
Tengo
TextBox
un usuario que debe ingresar varias páginas del documento para imprimir:... con esta propiedad vinculante:
También tengo un botón:
... con este comando vinculante:
Y luego está el método
SetNumberOfPages()
, pero no es importante para este tema. Funciona bien en mi caso porque no tengo que agregar ningún código al archivo de código subyacente de la Vista y me permite controlar el comportamiento usando laCommand
propiedad.fuente
Al verificar un valor numérico, puede usar la función VisualBasic.IsNumeric .
fuente
En la aplicación WPF, puede manejar esto manejando el
TextChanged
evento:fuente
Para los desarrolladores que desean que sus campos de texto acepten números sin firmar solo, como puertos de socket, etc.
WPF
C#
fuente
65535
. Si es mayor, entonces no es un puerto válido. Además, configurarTextBox.MaxLength
a5
ayudaría programáticamente o en XAML .Esto es lo que usaría para obtener un cuadro de texto WPF que acepte dígitos y el punto decimal:
Ponga el código en un nuevo archivo de clase, agregue
en la parte superior del archivo y compile la solución. El control numericTextBox aparecerá en la parte superior de la caja de herramientas.
fuente