Loupe

[Windows 8(.1)] Bloquer la saisie de caractères spéciaux dans une TextBox

Imaginez le scénario suivant: vous disposez d’une TextBox XAML et vous souhaitez empêcher l’utilisateur de saisir des caractères spéciaux (é, è, à, &, etc.).

La solution que je vous propose consiste à s’abonner à l’évènement KeyDown et à regarder si la touche pressée fait partie des touches “autorisées”:

private void OnTextBoxNameKeyDown(object sender, KeyRoutedEventArgs e)
{
    var shift = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);

    if (e.Key != VirtualKey.Space && e.Key != VirtualKey.Shift && e.Key != VirtualKey.Alt && e.Key != VirtualKey.Control)
    {
        if (!this.IsValidVirtualKey(e.Key, shift.HasFlag(Windows.UI.Core.CoreVirtualKeyStates.Down)))
            e.Handled = true;
    }
}

/// <summary>
/// Méthode qui indique détecte si l'utilisateur n'a appuyé que sur les touches "autorisées" (AZERTYUIOPQSDFGHJKLMWXCVBN1234567890)
/// </summary>
/// <param name="key">La touche pressée</param>
/// <param name="isShiftPressed">True si l'utilisateur appuie en même temps sur la touche Shift.</param>
/// <returns>Vrai si la touche appuyée est autorisée.</returns>
private bool IsValidVirtualKey(VirtualKey key, bool isShiftPressed)
{
    bool isValid = false;

    var search = new VirtualKey();

    foreach (var letter in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    {
        if (Enum.TryParse<VirtualKey>(letter.ToString(), out search))
        {
            if (key == search)
            {
                isValid = true;
                break;
            }
        }
    }

    foreach (var number in "Number1;Number2;Number3;Number4;Number5;Number6;Number7;Number8;Number9;Number0".Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
    {
        if (Enum.TryParse<VirtualKey>(number.ToString(), out search))
        {
            if (key == search && isShiftPressed)
            {
                isValid = true;
                break;
            }
        }
    }

    foreach (var number in "NumberPad1;NumberPad2;NumberPad3;NumberPad4;NumberPad5;NumberPad6;NumberPad7;NumberPad8;NumberPad9;NumberPad0".Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
    {
        if (Enum.TryParse<VirtualKey>(number.ToString(), out search))
        {
            if (key == search)
            {
                isValid = true;
                break;
            }
        }
    }

    return isValid;
}

Le code présenté dans cette solution se charge de plusieurs choses. Tout d’abord, on compare la touche appuyée avec les lettres de l’alphabet. Si la touche est trouvée dans cette liste, alors on sort de la boucle.

Dans le cas contraire, on vérifie si l’utilisateur n’a pas appuyé sur les touches “1”, “2”, etc. situées sur le haut du clavier (des ordinateurs portables par exemple). Cependant, pour que ces touches soient “valides”, il faut que l’utilisateur ait appuyé également sur la touche Shift.

Enfin, si aucune de ces touches n’est pressée (en complément de la touche Shift), on vérifie si ce n’est pas l’un des touches du KeyPad qui a été pressée.

 

Happy coding ! :)

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus