web-dev-qa-db-fra.com

Comment forcer textbox à ne prendre que des nombres dans WPF?

Je veux que l'utilisateur entre uniquement des valeurs numériques dans TextBox.

J'ai ce code:

private void txtType1_KeyPress(object sender, KeyPressEventArgs e)
{
     int isNumber = 0;
     e.Handled = !int.TryParse(e.KeyChar.ToString(), out isNumber);
}

Mais je ne reçois pas textbox_KeyPress event et e.KeyChar lors de l'utilisation de WPF.

Quelle est la solution dans WPF?

Edit:

J'ai fait une solution! 

private void txtName_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    CheckIsNumeric(e);
}

private void CheckIsNumeric(TextCompositionEventArgs e)
{
    int result;

    if(!(int.TryParse(e.Text, out result) || e.Text == "."))
    {
        e.Handled = true;
    }
}
25
Hasib Uz Zaman
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        char c = Convert.ToChar(e.Text);
        if (Char.IsNumber(c))
            e.Handled = false;
        else
            e.Handled = true;

        base.OnPreviewTextInput(e);
    }
17
Niki Nikpour

Vous pouvez utiliser une règle de validation ... http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

Ou créez votre propre zone de texte masquable http://rubenhak.com/?p=8

8
Phil Murray

Vous pouvez lier votre zone de texte avec une propriété de dépendance et à l’intérieur de la méthode de validation de la propriété de dépendance, vous pouvez vérifier si int.tryparse retourne la valeur true, sans quoi vous pouvez utiliser la valeur par défaut ou réinitialiser la valeur.

Vous pouvez également utiliser WPF ValidationRules pour savoir quand la valeur est modifiée. Une fois modifié, vous pouvez appliquer une logique pour la validation inout.

Ou vous pouvez utiliser IDataError Info pour la validation.

1
Haris Hasan

version peu améliorée de Hasib Uz Zaman

     private void txtExpecedProfit_PreviewTextInput_1(object sender, TextCompositionEventArgs e)
    {
        CheckIsNumeric((TextBox)sender,e);
    }

    private void CheckIsNumeric(TextBox sender,TextCompositionEventArgs e)
    {
        decimal result;
        bool dot = sender.Text.IndexOf(".") < 0 && e.Text.Equals(".") && sender.Text.Length>0;
        if (!(Decimal.TryParse(e.Text, out result ) || dot )  )
        {
            e.Handled = true;
        }
    }

cela vérifiera la duplication (marque décimale) et ne permettra pas seulement (marque décimale)

0
Riyal MHH
//Call this code on KeyDown Event
if((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || (e.Key == Key.Back))
{ e.Handled = false; }
else if((e.Key >= Key.D0 && e.Key <= Key.D9))
{ e.Handled = false; }
else
{ e.Handled = true; }
0
suyog patil
private void shomaretextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
  // xaml.cs code
  if (!char.IsDigit(e.Text, e.Text.Length - 1))
    e.Handled = true;
}

En xaml 

<TextBox x:Name="shomaretextBox" 
         HorizontalAlignment="Left" 
         Height="28" 
         Margin="125,10,0,0" 
         TextWrapping="Wrap" 
         VerticalAlignment="Top" 
         Width="151" 
         Grid.Column="1"        
         TextCompositionManager.PreviewTextInput="shomaretextBox_PreviewTextInput" />
0
amin zare

Dans WPF, les valeurs de code d'activation sont différentes des valeurs e.keychar normales de Winforms.

Dans l'événement PreviewKeyDown de la zone de texte, ajoutez ce code:

if ((e.key < 34) | (e.key > 43)) {
if ((e.key < 74) | (e.key > 83)) {
    if ((e.key == 2)) {
        return;
        }
    e.handled = true;
    }
}

Cela permettra à l'utilisateur de ne saisir que des numéros dans la section Numpad0 - Numpad9 et D0 - D9, ainsi que dans la clé.

J'espère que ça aide, à la vôtre!

0
George