410 Stimmen

Wie bekomme ich eine TextBox nur numerische Eingabe in WPF zu akzeptieren?

Ich möchte Ziffern und das Dezimalkomma akzeptieren, aber kein Vorzeichen.

Ich habe mir Beispiele angesehen, die das NumericUpDown-Steuerelement für Windows Forms verwenden, und dieses Beispiel für ein benutzerdefiniertes Steuerelement NumericUpDown von Microsoft . Aber bisher scheint es wie NumericUpDown (unterstützt von WPF oder nicht) ist nicht gehen, um die Funktionalität, die ich will zu bieten. Die Art und Weise meine Anwendung entworfen ist, niemand bei klarem Verstand wird wollen, um mit den Pfeilen zu verwirren. Sie machen keinen praktischen Sinn, im Kontext meiner Anwendung.

Also ich bin auf der Suche nach einem einfachen Weg, um eine Standard-WPF-TextBox akzeptieren nur die Zeichen, die ich will. Ist dies möglich? Ist es praktisch?

5voto

Beyondo Punkte 2319

Für Entwickler, die möchten, dass ihre Textfelder nur vorzeichenlose Zahlen akzeptieren, wie z. B. Socket-Ports usw:

WPF

<TextBox PreviewTextInput="Port_PreviewTextInput" MaxLines="1"/>

C#

private void Port_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = !int.TryParse(e.Text, out int x);
}

4voto

Chris Punkte 2194

Für diejenigen, die eine schnelle und sehr einfache Implementierung für diese Art von Problem suchen, die nur Ganzzahlen und Dezimalzahlen verwendet, fügen Sie in Ihrer XAML-Datei eine PreviewTextInput Eigenschaft zu Ihrem TextBox und dann in Ihrer xaml.cs-Datei verwenden:

private void Text_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = !char.IsDigit(e.Text.Last()) && !e.Text.Last() == '.';
}

Es ist irgendwie überflüssig, die gesamte Zeichenfolge jedes Mal zu überprüfen, es sei denn, wie andere erwähnt haben, Sie tun etwas mit wissenschaftlicher Notation (obwohl, wenn Sie bestimmte Zeichen wie 'e' hinzufügen, eine einfache Regex hinzufügen Symbole/Zeichen ist wirklich einfach und in anderen Antworten veranschaulicht). Aber für einfache Fließkommazahlen wird diese Lösung ausreichen.

Geschrieben als Einzeiler mit einem Lambda-Ausdruck:

private void Text_PreviewTextInput(object sender, TextCompositionEventArgs e) => e.Handled = !char.IsDigit(e.Text.Last() && !e.Text.Last() == '.');

4voto

Julian Kowalczuk Punkte 135
PreviewTextInput += (s, e) =>
{
    e.Handled = !e.Text.All(char.IsDigit);
};

3voto

juraj Punkte 23

Die beste und eleganteste Lösung, um nur ganzzahlige Zahlen in Textfeldern zuzulassen (auch in einem gewissen Bereich), ist:

XAML:

<TextBox PreviewTextInput="ValidationTextBox" TextChanged="TextBox_TextChanged"/>

C#:

private void ValidationTextBox(object sender, TextCompositionEventArgs e)
{
    int max = 100;

    //do not allow futher incorrect typing
    e.Handled = !(int.TryParse(((TextBox)sender).Text + e.Text, out int i) && i >= 1 && i <= max);
}

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    int max = 100;

    if (!int.TryParse(((TextBox)sender).Text, out int j) || j < 1 || j > max)
    {
        //delete incoret input
        ((TextBox)sender).Text = "";
    }
    else
    {
        //delete leading zeros
        ((TextBox)sender).Text = j.ToString();
    }
}

Sie können die minimal und maximal zulässige Anzahl mit max (min) einstellen, indem Sie den Schalter ((TextBox)sender).Name .

Bei dieser Lösung sind keine führenden Nullen und kein Copy-Paste der Eingabe möglich. In jedem Szenario werden Sie eine korrekte Zahl im Textfeld haben.

3voto

Shahin Dohan Punkte 5128

Wie wäre es damit? Das funktioniert bei mir gut. Ich hoffe, ich habe keine Sonderfälle übersehen...

MyTextBox.PreviewTextInput += (sender, args) =>
{
    if (!int.TryParse(args.Text, out _))
    {
        args.Handled = true;
    }
};

DataObject.AddPastingHandler(MyTextBox, (sender, args) =>
{
    var isUnicodeText = args.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true);
    if (!isUnicodeText)
    {
        args.CancelCommand();
    }

    var data = args.SourceDataObject.GetData(DataFormats.UnicodeText) as string;
    if (!int.TryParse(data, out _))
    {
        args.CancelCommand();
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X