1
votes

Restreindre les caractères dans TextBox des applications UWP

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 :


1
votes
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;
    }
}

6 commentaires

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);



-1
votes

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.


2 commentaires

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.



0
votes

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


0 commentaires

0
votes

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" />


0 commentaires