Saisie de données numériques dans WPF

Comment gérez-vous la saisie de valeurs numériques dans les applications WPF ?

Sans un contrôle NumericUpDown, j'ai utilisé un TextBox et géré son événement PreviewKeyDown avec le code ci-dessous, mais c'est plutôt moche.

Quelqu'un a-t-il trouvé un moyen plus simple d'obtenir des données numériques de l'utilisateur sans recourir à un contrôle tiers ?

private void NumericEditPreviewKeyDown(object sender, KeyEventArgs e)
{
    bool isNumPadNumeric = (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || e.Key == Key.Decimal;
    bool isNumeric = (e.Key >= Key.D0 && e.Key <= Key.D9) || e.Key == Key.OemPeriod;

    if ((isNumeric || isNumPadNumeric) && Keyboard.Modifiers != ModifierKeys.None)
    {
        e.Handled = true;
        return;
    }

    bool isControl = ((Keyboard.Modifiers != ModifierKeys.None && Keyboard.Modifiers != ModifierKeys.Shift)
        || e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Insert
        || e.Key == Key.Down || e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up
        || e.Key == Key.Tab
        || e.Key == Key.PageDown || e.Key == Key.PageUp
        || e.Key == Key.Enter || e.Key == Key.Return || e.Key == Key.Escape
        || e.Key == Key.Home || e.Key == Key.End);

    e.Handled = !isControl && !isNumeric && !isNumPadNumeric;
}
请先 登录 后评论

7 réponses

tags2k

Traitez-moi de fou, mais pourquoi ne pas mettre les boutons plus et moins de chaque côté du contrôle TextBox et empêcher simplement le TextBox de recevoir le focus du curseur, créant ainsi votre propre contrôle NumericUpDown bon marché ?

请先 登录 后评论
Arcturus

Que diriez-vous :

protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
{
    e.Handled = !AreAllValidNumericChars(e.Text);
    base.OnPreviewTextInput(e);
}

private bool AreAllValidNumericChars(string str)
{
    foreach(char c in str)
    {
        if(!Char.IsNumber(c)) return false;
    }

    return true;
}
请先 登录 后评论
Nidonocu

Vous pouvez également essayer d'utiliser la validation des données si les utilisateurs valident les données avant que vous ne les utilisiez. J'ai trouvé que faire cela était assez simple et plus propre que de jouer avec des clés.

Sinon, vous pouvez toujours désactiver la fonction Coller !

请先 登录 后评论
Mark Allen

Ne pouvez-vous pas simplement utiliser quelque chose comme ce qui suit ?

int numericValue = 0;

if (false == int.TryParse(yourInput, out numericValue))
{
    // handle non-numeric input
}
请先 登录 后评论
Ritz
Private Sub Value1TextBox_PreviewTextInput(ByVal sender As Object, ByVal e As TextCompositionEventArgs) Handles Value1TextBox.PreviewTextInput
    Try
        If Not IsNumeric(e.Text) Then
            e.Handled = True
        End If
    Catch ex As Exception
    End Try
End Sub

A fonctionné pour moi.

请先 登录 后评论
bcd
void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
    string sVal = e.Text;
    int val = 0;

    if (sVal != null && sVal.Length > 0)
    {
        if (int.TryParse(sVal, out val))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }
}
请先 登录 后评论
juanagui
public class NumericTextBox : TextBox
{
    public NumericTextBox()
        : base()
    {
        DataObject.AddPastingHandler(this, new DataObjectPastingEventHandler(CheckPasteFormat));
    }

    private Boolean CheckFormat(string text)
    {
        short val;
        return Int16.TryParse(text, out val);
    }

    private void CheckPasteFormat(object sender, DataObjectPastingEventArgs e)
    {
        var isText = e.SourceDataObject.GetDataPresent(System.Windows.DataFormats.Text, true);

        if (isText)
        {
            var text = e.SourceDataObject.GetData(DataFormats.Text) as string;
            if (CheckFormat(text))
            {
                return;
            }
        }

        e.CancelCommand();
    }

    protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
    {
        if (!CheckFormat(e.Text))
        {
            e.Handled = true;
        }
        else
        {
            base.OnPreviewTextInput(e);
        }
    }
}

De plus, vous pouvez personnaliser le comportement d'analyse en fournissant les propriétés de dépendance appropriées.

请先 登录 后评论
  • 2 abonnés
  • 0 favoris,495 Feuilleter
  • Matt Hamilton posée à 2023-03-22 18:31

problème similaire