Je cherche à accepter les chiffres et le point décimal, mais aucun signe.
J'ai examiné des exemples à l'aide du contrôle NumericUpDown pour Windows Forms et cet exemple d'un contrôle personnalisé NumericUpDown de Microsoft . Mais jusqu'à présent, il semble que NumericUpDown (pris en charge par WPF ou non) ne fournira pas les fonctionnalités que je souhaite. La façon dont mon application est conçue, personne sensé ne voudra jouer avec les flèches. Ils n'ont aucun sens pratique, dans le cadre de ma candidature.
Je recherche donc un moyen simple de faire en sorte qu'une TextBox WPF standard n'accepte que les caractères que je veux. Est-ce possible? Est-ce pratique?
double.TryParse()
serait probablement implémenté avec le même nombre de lignes et serait plus flexible.Le gestionnaire d'événements prévisualise la saisie de texte. Ici, une expression régulière ne correspond à la saisie de texte que si elle n'est pas un nombre, puis elle n'est pas effectuée dans la zone de texte d'entrée.
Si vous ne voulez que des lettres, remplacez l'expression régulière par
[^a-zA-Z]
.XAML
FICHIER XAML.CS
la source
J'ai utilisé une partie de ce qui était déjà là et y ai apporté ma propre touche en utilisant un comportement, donc je n'ai pas à propager ce code sur une tonne de vues ...
Voici le code de vue pertinent:
la source
Il s'agit d'une solution améliorée de la réponse de WilP . Mes améliorations sont:
EmptyValue
Propriété ajoutée , si une chaîne vide est inappropriéeL'utilisation est assez simple:
la source
MaxLength
votre condition(this.MaxLength == 0 || text.Length <= this.MaxLength)
revient toujoursfalse
lors du test du nouveau texte. Cela devrait être mieux(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
puisque vous définissezint.MinValue
comme valeur par défaut pourMaxLength
.UpdateSourceTrigger=PropertyChanged
à la liaison. Une idée sur la façon de faire fonctionner ce code lorsque vous changez leUpdateSourceTrigger
est défini surPropertyChanged
? Merci d'avoir partagé ce code.Voici un moyen très simple et facile de le faire en utilisant MVVM.
Liez votre textBox avec une propriété entière dans le modèle de vue, et cela fonctionnera comme une gemme ... cela affichera même la validation lorsqu'un non-entier est entré dans la zone de texte.
Code XAML:
Voir le code du modèle:
la source
long
àfloat
, mais cela n'a pas fonctionné correctement avec une validation immédiate. J'ai ajoutéUpdateSourceTrigger="PropertyChanged"
à la liaison, afin qu'elle effectue la validation lorsque chaque caractère a été tapé, et ne pouvait plus taper un '.' dans la TextBox, sauf si un caractère illégal était présent (a dû taper "1x.234" puis supprimer le "x"). Cela semble également un peu lent dans ce mode. Cela semble utiliserSystem.Number.ParseSingle()
pour faire le travail, donc il accepte une variété de notations.Ajoutez une RÈGLE DE VALIDATION pour que lorsque le texte change, vérifiez si les données sont numériques et si c'est le cas, permettez au traitement de continuer, et si ce n'est pas le cas, demandez à l'utilisateur que seules les données numériques sont acceptées dans ce champ.
En savoir plus sur la validation dans Windows Presentation Foundation
la source
double
et cela vous fournit déjà une validation standard.La boîte à outils WPF étendue en a une: NumericUpDown
la source
NumericUpDown
c'est désormais obsolète. vous pouvez utiliser àDecimalUpDown
partir de la boîte à outils étendue WPF Toolkit ™ Community EditionPourrait également simplement implémenter une règle de validation et l'appliquer à la TextBox:
Avec la mise en œuvre de la règle comme suit (en utilisant le même Regex que proposé dans d'autres réponses):
la source
Ici, j'ai une solution simple inspirée de la réponse de Ray . Cela devrait être suffisant pour identifier toute forme de numéro.
Cette solution peut également être facilement modifiée si vous ne souhaitez que des nombres positifs, des valeurs entières ou des valeurs précises avec un nombre maximum de décimales, etc.
Comme suggéré dans la réponse de Ray , vous devez d'abord ajouter un
PreviewTextInput
événement:Mettez ensuite ce qui suit dans le code:
la source
J'ai autorisé les numéros du clavier numérique et le retour arrière:
la source
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);
Je suppose que:
Votre TextBox pour laquelle vous souhaitez autoriser la saisie numérique a uniquement sa propriété Text initialement définie sur une valeur numérique valide (par exemple, 2,7172).
Votre Textbox est un enfant de votre fenêtre principale
Votre fenêtre principale est de la classe Window1
Votre nom TextBox est numericTB
Idée basique:
Ajouter:
private string previousText;
à votre classe de fenêtre principale (Window1)Ajouter:
previousText = numericTB.Text;
à votre constructeur de fenêtre principaleCréez un gestionnaire pour que l'événement numericTB.TextChanged soit quelque chose comme ceci:
Cela conservera la valeur de previousText sur numericTB.Text tant qu'il est valide et définira numericTB.Text sur sa dernière valeur valide si l'utilisateur écrit quelque chose que vous n'aimez pas. Bien sûr, ce n'est qu'une idée de base, et c'est juste "résistant aux idiots", pas "à l'épreuve des idiots". Il ne gère pas le cas dans lequel l'utilisateur joue avec des espaces, par exemple. Voici donc une solution complète qui, à mon avis, est "à l'épreuve des idiots", et si je me trompe, dites-le moi:
Contenu de votre fichier Window1.xaml:
Contenu de votre fichier Window.xaml.cs:
Et c'est tout. Si vous avez plusieurs TextBox, je vous recommande de créer un CustomControl qui hérite de TextBox, afin que vous puissiez envelopper previousText et numericTB_TextChanged dans un fichier séparé.
la source
C'est le seul code nécessaire:
Cela permet uniquement de saisir des nombres dans la zone de texte.
Pour autoriser un point décimal ou un signe moins, vous pouvez remplacer l'expression régulière par
[^0-9.-]+
.la source
Si vous ne voulez pas écrire beaucoup de code pour faire une fonction de base (je ne sais pas pourquoi les gens font des méthodes longues), vous pouvez simplement faire ceci:
Ajouter un espace de noms:
En XAML, définissez une propriété TextChanged:
Dans WPF sous la méthode txt1_TextChanged, ajoutez
Regex.Replace
:la source
Une autre approche consistera à utiliser un comportement attaché, j'ai implémenté ma classe TextBoxHelper personnalisée , qui peut être utilisée sur des zones de texte partout dans mon projet. Parce que je pensais que l'abonnement aux événements pour chaque zone de texte et dans chaque fichier XAML individuel à cette fin peut prendre du temps.
La classe TextBoxHelper que j'ai implémentée présente les caractéristiques suivantes:
Voici l'implémentation de la classe TextBoxHelper:
Et voici un exemple de son utilisation facile:
Ou
Notez que mon TextBoxHelper réside dans l'alias xmlns viewHelpers.
J'espère que cette implémentation facilite le travail de quelqu'un d'autre :)
la source
dans l'aperçu de l'événement keydown de la zone de texte.
la source
la source
.
, care.Text
ne renvoie que le dernier caractère saisi et un point échouera à laIsDigit
vérification.Pour ceux qui recherchent une implémentation rapide et très simple pour ce type de problème en utilisant uniquement des nombres entiers et décimaux, dans votre fichier XAML, ajoutez une
PreviewTextInput
propriété à votreTextBox
puis dans votre fichier xaml.cs utilisez:C'est un peu redondant de continuer à vérifier la chaîne entière à chaque fois, sauf si, comme d'autres l'ont mentionné, vous faites quelque chose avec une notation scientifique (bien que, si vous ajoutez certains caractères comme «e», une simple expression régulière ajoutant des symboles / caractères soit vraiment simple et illustré dans d'autres réponses). Mais pour les valeurs à virgule flottante simples, cette solution suffira.
Écrit comme une ligne avec une expression lambda:
la source
Nous pouvons faire la validation sur l'événement modifié de la zone de texte. L'implémentation suivante empêche la saisie au clavier autre que numérique et un point décimal.
la source
Que dis-tu de ça? Fonctionne bien pour moi. J'espère que je n'ai raté aucun cas de bord ...
la source
Dans Windows Forms, c'était facile; vous pouvez ajouter un événement pour KeyPress et tout fonctionne facilement. Cependant, dans WPF, cet événement n'existe pas. Mais il existe un moyen beaucoup plus simple.
Le WPF TextBox a l'événement TextChanged qui est général pour tout. Cela comprend le collage, la dactylographie et tout ce qui peut vous venir à l'esprit.
Vous pouvez donc faire quelque chose comme ceci:
XAML:
CODE DERRIÈRE:
Cela accepte également
.
, si vous ne le souhaitez pas, supprimez-le simplement de laregex
déclaration@[^\d]
.Remarque : Cet événement peut être utilisé sur de nombreuses TextBox car il utilise le
sender
texte de l' objet. Vous écrivez l'événement une seule fois et pouvez l'utiliser pour plusieurs TextBox'es.la source
Maintenant, je sais que cette question a une réponse acceptée , mais personnellement, je trouve cela un peu déroutant et je pense que cela devrait être plus facile que cela. Je vais donc essayer de montrer comment je l'ai fait fonctionner du mieux que je peux:
Dans Windows Forms , il existe un événement appelé
KeyPress
qui convient parfaitement à ce type de tâche. Mais cela n'existe pas dans WPF , donc à la place, nous utiliserons l'PreviewTextInput
événement. De plus, pour la validation, je crois que l'on peut utiliser unforeach
pour parcourir letextbox.Text
et vérifier s'il correspond ;) la condition, mais honnêtement, c'est ce que les expressions régulières servent les .Encore une chose avant de plonger dans le code sacré . Pour que l'événement soit déclenché, on peut faire deux choses:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
cas du formulaire (dans lequel se trouve le textBox):textBox.PreviewTextInput += onlyNumeric;
Je pense que la deuxième méthode est meilleure parce que dans des situations comme celle-ci, vous devrez surtout appliquer la même condition (
regex
) à plusieursTextBox
et vous ne voulez pas vous répéter!.Enfin, voici comment procéder:
la source
En voici ma version. C'est basé sur une base
ValidatingTextBox
classe de qui annule simplement ce qui a été fait s'il n'est pas "valide". Il prend en charge le collage, la coupe, la suppression, le retour arrière, +, - etc.Pour un entier 32 bits, il existe une classe Int32TextBox qui se compare simplement à un int. J'ai également ajouté des classes de validation à virgule flottante.
Remarque 1: lorsque vous utilisez la liaison WPF, vous devez vous assurer que vous utilisez la classe qui correspond au type de propriété lié sinon, cela peut conduire à des résultats étranges.
Remarque 2: lorsque vous utilisez des classes à virgule flottante avec une liaison WPF, assurez-vous que la liaison utilise la culture actuelle pour correspondre à la méthode TryParse que j'ai utilisée.
la source
Voici une bibliothèque pour la saisie numérique dans WPF
Il a des propriétés comme
NumberStyles
etRegexPattern
pour la validation.Sous-classes WPF
TextBox
la source
Utilisation:
la source
Je travaillais avec une boîte non liée pour un projet simple sur lequel je travaillais, donc je ne pouvais pas utiliser l'approche de reliure standard. Par conséquent, j'ai créé un hack simple que d'autres pourraient trouver très pratique en étendant simplement le contrôle TextBox existant:
Évidemment, pour un type flottant, vous voudrez l'analyser en tant que flottant et ainsi de suite. Les mêmes principes s'appliquent.
Ensuite, dans le fichier XAML, vous devez inclure l'espace de nom approprié:
Après cela, vous pouvez l'utiliser comme un contrôle régulier:
la source
Après avoir utilisé certaines des solutions ici pendant un certain temps, j'ai développé la mienne qui fonctionne bien pour ma configuration MVVM. Notez qu'il n'est pas aussi dynamique que certains des autres dans le sens de permettre toujours aux utilisateurs d'entrer des caractères erronés, mais cela les empêche d'appuyer sur le bouton et donc de faire quoi que ce soit. Cela va bien avec mon thème de grisonner les boutons lorsque les actions ne peuvent pas être effectuées.
Je dois
TextBox
qu'un utilisateur doit entrer un certain nombre de pages de document à imprimer:... avec cette propriété de liaison:
J'ai aussi un bouton:
... avec cette liaison de commande:
Et puis il y a la méthode de
SetNumberOfPages()
, mais ce n'est pas important pour ce sujet. Cela fonctionne bien dans mon cas, car je n'ai pas besoin d'ajouter de code dans le fichier code-behind de View et cela me permet de contrôler le comportement à l'aide de laCommand
propriété.la source
Lors de la vérification d'une valeur numérique, vous pouvez utiliser la fonction VisualBasic.IsNumeric .
la source
Dans l'application WPF, vous pouvez gérer cela en gérant l'
TextChanged
événement:la source
Pour les développeurs qui souhaitent que leurs champs de texte acceptent uniquement les numéros non signés, tels que les ports de socket, etc.:
WPF
C #
la source
65535
. S'il est supérieur, ce n'est pas un port valide. En outre, le réglage de laTextBox.MaxLength
à5
contribuerait par programmation ou en XAML .Voici ce que j'utiliserais pour obtenir une zone de texte WPF qui accepte les chiffres et le point décimal:
Mettez le code dans un nouveau fichier de classe, ajoutez
en haut du fichier et créez la solution. Le contrôle numericTextBox apparaîtra alors en haut de la boîte à outils.
la source