My TextBox ne devrait autoriser que ce que vous pouvez taper dans une calculatrice de base comme les nombres 0 à 9
et % * / - +. ()
Donc, pas de lettres et autres caractères. J'ai essayé ce qui suit à partir d'un autre fil SO mais cela ne fait rien. Vous pouvez toujours taper à peu près tout dans la zone de texte.
private void textBox_KeyDown(object sender, KeyRoutedEventArgs e) { if ((e.Key < VirtualKey.NumberPad0 || e.Key > VirtualKey.NumberPad9) & (e.Key < VirtualKey.Number0 || e.Key > VirtualKey.Number9)) { e.Handled = true; } }
4 Réponses :
private void textBox_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { if (!Regex.IsMatch(sender.Text, @"^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$") && sender.Text != "") { int position = sender.SelectionStart - 1; sender.Text = sender.Text.Remove(position, 1); sender.SelectionStart = position; } }
Corrigez-moi si je me trompe mais que les événements KeyPress ne sont pas disponibles dans UWP?
@AdamMcMahon Vous avez raison. J'ai changé le code pour qu'il fonctionne avec UWP.
obtenir des soulignements rouges sous \ d \. \ / dans la ligne regex
@EsAMe J'ai édité pour résoudre le problème dû ajouter un @ avant la chaîne.
System.ArgumentOutOfRangeException: 'StartIndex ne peut pas être inférieur à zéro.'
Sonne comme sender.SelectionStart est initialisé à 0 donc votre instruction sender.Text = sender.Text.Remove (position, 1); devient sender.Text = sender.Text.Remove (-1, 1);
La méthode la plus simple (IMO)
Si vous ciblez Windows 10 Fall Creators Update (introduit v10.0.16299.0), vous pouvez utiliser l'événement TextBoxBeforeTextChanging. L'exemple ci-dessous limite l'utilisateur uniquement aux chiffres, mais peut facilement être développé.
private void TextBox_OnBeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args) { args.Cancel = args.NewText.Any(c => !char.IsDigit(c)); }
Sinon, cette réponse semble faire à peu près ce que vous voulez, sans avoir à cibler la mise à jour des créateurs d'automne.
Pourriez-vous s'il vous plaît le développer, car je ne sais pas comment faire cela.
TextBoxBeforeTextChanging n'est pas suffisant, l'utilisation peut contourner cela à l'aide de l'éditeur de méthode d'entrée, qui ignore les événements de texte.
Vous pouvez simplement utiliser une propriété d'extension regex fournie dans la boîte à outils UWP XAML. Choisissez simplement le type de validation décimal ou vous pouvez utiliser votre propre expression régulière.
<TextBox extensions:TextBoxRegex.Regex="^\s*\+?\s*([0-9][\s-]*){9,}$" /> <TextBox extensions:TextBoxRegex.ValidationMode="Forcedâ extensions:TextBoxRegex.ValidationType="Decimal" />
https://docs.microsoft.com/en-us/windows/communitytoolkit/extensions/textboxregex
Vous pouvez utiliser la méthode suivante pour autoriser ce dont vous avez besoin.
.xaml:
private void TextBox_OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args) { char[] chars = { '%', '*', '/', '-', '+', '.', '(', ')' }; sender.Text = new String(sender.Text.Where(c => (char.IsDigit(c) || chars.Contains(c))).ToArray()); }
.cs
<TextBox Width="200" Height="100" TextChanging="TextBox_OnTextChanging" />
Copie possible de Utilisation de UWP TextBox.TextChanging pour ignorer les données erronées