Ich möchte Ziffern und den Dezimalpunkt akzeptieren, aber kein Vorzeichen.
Ich habe mir Beispiele mit dem NumericUpDown-Steuerelement für Windows Forms und dieses Beispiel eines benutzerdefinierten NumericUpDown-Steuerelements von Microsoft angesehen . Bisher scheint es jedoch so, als würde NumericUpDown (von WPF unterstützt oder nicht) nicht die gewünschte Funktionalität bieten. So wie meine Anwendung gestaltet ist, wird niemand, der bei klarem Verstand ist, mit den Pfeilen herumspielen wollen. Sie ergeben im Rahmen meiner Bewerbung keinen praktischen Sinn.
Daher suche ich nach einer einfachen Möglichkeit, eine Standard-WPF-Textbox so zu gestalten, dass sie nur die gewünschten Zeichen akzeptiert. Ist das möglich? Ist es praktisch?
double.TryParse()
würde wahrscheinlich mit der gleichen Anzahl von Zeilen implementiert und flexibler sein.Der Ereignishandler zeigt eine Vorschau der Texteingabe an. Hier stimmt ein regulärer Ausdruck nur dann mit der Texteingabe überein, wenn es sich nicht um eine Zahl handelt, und wird dann nicht zum Eingabe-Textfeld gemacht.
Wenn Sie nur Buchstaben möchten, ersetzen Sie den regulären Ausdruck als
[^a-zA-Z]
.XAML
XAML.CS-DATEI
quelle
Ich habe einiges von dem verwendet, was bereits hier war, und es mit einem Verhalten selbst verändert, damit ich diesen Code nicht über eine Tonne von Ansichten hinweg verbreiten muss ...
Hier ist der relevante Ansichtscode:
quelle
Dies ist eine verbesserte Lösung der Antwort von WilP . Meine Verbesserungen sind:
EmptyValue
Eigenschaft hinzugefügt , wenn leere Zeichenfolge unangemessen istDie Verwendung ist ziemlich einfach:
quelle
MaxLength
Sie den Zustand nicht einstellen,(this.MaxLength == 0 || text.Length <= this.MaxLength)
kehrt er immer zurück,false
wenn Sie den neuen Text testen. Dies sollte besser sein,(this.MaxLength == int.MinValue || text.Length <= this.MaxLength)
da Sieint.MinValue
als Standardwert für festlegenMaxLength
.UpdateSourceTrigger=PropertyChanged
zur Bindung hinzufüge . Jede Idee , wie dieser Code zur Arbeit zu kommen , wenn das Ändern derUpdateSourceTrigger
festgelegt istPropertyChanged
? Vielen Dank, dass Sie diesen Code geteilt haben.Hier ist eine sehr einfache und einfache Möglichkeit, dies mit MVVM zu tun.
Binden Sie Ihre TextBox mit einer Ganzzahl-Eigenschaft im Ansichtsmodell, und dies funktioniert wie ein Juwel. Es wird sogar die Validierung angezeigt, wenn eine Nicht-Ganzzahl in das Textfeld eingegeben wird.
XAML-Code:
Modellcode anzeigen:
quelle
long
zufloat
, aber es hat nicht ganz richtig mit sofortiger Validierung arbeiten. IchUpdateSourceTrigger="PropertyChanged"
habe der Bindung hinzugefügt , damit sie die Validierung durchführt, wenn jedes Zeichen eingegeben wird, und kein 'mehr' eingeben kann. in der TextBox, es sei denn, es war ein unzulässiges Zeichen vorhanden (musste "1x.234" eingeben und dann das 'x' löschen). In diesem Modus fühlt es sich auch etwas träge an. Dies scheint fürSystem.Number.ParseSingle()
die Arbeit verwendet zu werden, daher werden verschiedene Notationen akzeptiert.Fügen Sie eine GÜLTIGKEITSREGEL hinzu, damit Sie bei einer Textänderung überprüfen können, ob die Daten numerisch sind. Wenn dies der Fall ist, kann die Verarbeitung fortgesetzt werden. Wenn dies nicht der Fall ist, wird der Benutzer aufgefordert, nur numerische Daten in diesem Feld zu akzeptieren.
Weitere Informationen finden Sie unter Validierung in Windows Presentation Foundation
quelle
double
der Ihnen bereits eine Standardvalidierung bietet.Das Extented WPF Toolkit verfügt über eines: NumericUpDown
quelle
NumericUpDown
jetzt veraltet ist. Sie können verwendenDecimalUpDown
aus dem aktualisierten Toolkit Extended WPF Toolkit ™ Community Edition verwendenKönnte auch einfach eine Validierungsregel implementieren und auf die TextBox anwenden:
Mit der Implementierung der Regel wie folgt (unter Verwendung des gleichen Regex wie in anderen Antworten vorgeschlagen):
quelle
Hier habe ich eine einfache Lösung inspiriert von Rays Antwort ist . Dies sollte ausreichen, um jede Form von Nummer zu identifizieren.
Diese Lösung kann auch leicht geändert werden, wenn Sie nur positive Zahlen, ganzzahlige Werte oder Werte mit einer maximalen Anzahl von Dezimalstellen usw. wünschen.
Wie in Rays Antwort vorgeschlagen , müssen Sie zuerst ein
PreviewTextInput
Ereignis hinzufügen :Fügen Sie dann Folgendes in den Code dahinter ein:
quelle
Ich erlaubte Ziffernblocknummern und Rücktaste:
quelle
var keyEnum = (System.Windows.Input.Key) e.Key; e.Handled = !(keyEnum >= System.Windows.Input.Key.D0 && keyEnum <= System.Windows.Input.Key.D9 || keyEnum >= System.Windows.Input.Key.NumPad0 && keyEnum <= System.Windows.Input.Key.NumPad9 || keyEnum == System.Windows.Input.Key.Back);
Ich gehe davon aus, dass:
In Ihrer TextBox, für die Sie nur numerische Eingaben zulassen möchten, ist die Eigenschaft Text zunächst auf einen gültigen Zahlenwert festgelegt (z. B. 2.7172).
Ihre Textbox ist ein untergeordnetes Element Ihres Hauptfensters
Ihr Hauptfenster ist von der Klasse Window1
Ihr TextBox-Name ist numericTB
Grundidee:
Hinzufügen:
private string previousText;
zu Ihrer Hauptfensterklasse (Window1)Hinzufügen:
previousText = numericTB.Text;
zu Ihrem HauptfensterkonstruktorErstellen Sie einen Handler für das numericTB.TextChanged-Ereignis, der ungefähr so aussieht:
Dadurch wird previousText so lange wie möglich auf numericTB.Text gesetzt und numericTB.Text auf den letzten gültigen Wert gesetzt, wenn der Benutzer etwas schreibt, das Ihnen nicht gefällt. Natürlich ist dies nur eine Grundidee, und es ist nur "idiotenresistent", nicht "idiotensicher". Der Fall, in dem der Benutzer beispielsweise mit Leerzeichen herumspielt, wird nicht behandelt. Hier ist also eine vollständige Lösung, die ich für "idiotensicher" halte. Wenn ich falsch liege, sagen Sie mir bitte:
Inhalt Ihrer Window1.xaml-Datei:
Inhalt Ihrer Window.xaml.cs-Datei:
Und das ist es. Wenn Sie viele TextBoxen haben, empfehle ich, ein CustomControl zu erstellen, das von TextBox erbt, damit Sie previousText und numericTB_TextChanged in einer separaten Datei zusammenfassen können.
quelle
Dies ist der einzige Code, der benötigt wird:
Dadurch können nur Zahlen in das Textfeld eingegeben werden.
Um einen Dezimalpunkt oder ein Minuszeichen zuzulassen, können Sie den regulären Ausdruck in ändern
[^0-9.-]+
.quelle
Wenn Sie nicht viel Code schreiben möchten, um eine Grundfunktion auszuführen (ich weiß nicht, warum Leute lange Methoden anwenden), können Sie dies einfach tun:
Namespace hinzufügen:
Legen Sie in XAML eine TextChanged-Eigenschaft fest:
Fügen Sie in WPF unter der Methode txt1_TextChanged Folgendes hinzu
Regex.Replace
:quelle
Ein anderer Ansatz ist die Verwendung eines angehängten Verhaltens. Ich habe meine benutzerdefinierte TextBoxHelper- Klasse implementiert , die für Textfelder in meinem gesamten Projekt verwendet werden kann. Weil ich mir gedacht habe, dass das Abonnieren der Ereignisse für jedes Textfeld und für jede einzelne XAML-Datei zu diesem Zweck zeitaufwändig sein kann.
Die von mir implementierte TextBoxHelper-Klasse verfügt über folgende Funktionen:
Hier ist die Implementierung der TextBoxHelper-Klasse:
Und hier ist ein Beispiel für die einfache Verwendung:
Oder
Beachten Sie, dass sich mein TextBoxHelper im Alias viewHelpers xmlns befindet.
Ich hoffe, dass diese Implementierung die Arbeit anderer erleichtert :)
quelle
in der Vorschau Keydown-Ereignis des Textfelds.
quelle
quelle
.
, dae.Text
nur das letzte Eingabezeichen zurückgegeben wird und ein Punkt dieIsDigit
Prüfung nicht besteht.Wenn Sie nach einer schnellen und sehr einfachen Implementierung für diese Art von Problem suchen, bei der nur Ganzzahlen und Dezimalzahlen verwendet werden, fügen Sie in Ihrer XAML-Datei eine
PreviewTextInput
Eigenschaft zu Ihrer hinzuTextBox
und verwenden Sie dann in Ihrer xaml.cs-Datei Folgendes:Es ist überflüssig, jedes Mal die gesamte Zeichenfolge zu überprüfen, es sei denn, Sie haben, wie andere bereits erwähnt haben, etwas mit wissenschaftlicher Notation getan (wenn Sie jedoch bestimmte Zeichen wie 'e' hinzufügen, ist eine einfache Regex das Hinzufügen von Symbolen / Zeichen wirklich einfach und in anderen Antworten illustriert). Für einfache Gleitkommawerte reicht diese Lösung jedoch aus.
Geschrieben als Einzeiler mit Lambda-Ausdruck:
quelle
Wir können eine Validierung für ein vom Textfeld geändertes Ereignis durchführen. Die folgende Implementierung verhindert andere Tastendruckeingaben als numerische und einen Dezimalpunkt.
quelle
Wie wäre es damit? Funktioniert gut für mich. Hoffe ich habe keine Edge Cases verpasst ...
quelle
In Windows Forms war es einfach; Sie können ein Ereignis für KeyPress hinzufügen und alles funktioniert problemlos. In WPF ist dieses Ereignis jedoch nicht vorhanden. Aber es gibt einen viel einfacheren Weg.
Die WPF TextBox hat das TextChanged-Ereignis, das für alles allgemein ist. Es beinhaltet das Einfügen, Tippen und alles, was Ihnen in den Sinn kommt.
Sie können also so etwas tun:
XAML:
CODE HINTER:
Dies akzeptiert auch
.
, wenn Sie es nicht möchten, entfernen Sie es einfach aus derregex
Anweisung zu sein@[^\d]
.Hinweis : Dieses Ereignis kann in vielen Textfeldern verwendet werden, da es den
sender
Text des Objekts verwendet. Sie schreiben das Ereignis nur einmal und können es für mehrere TextBoxen verwenden.quelle
Jetzt weiß ich, dass diese Frage eine akzeptierte Antwort hat , aber ich persönlich finde sie etwas verwirrend und ich glaube, es sollte einfacher sein. Also werde ich versuchen zu demonstrieren, wie ich es so gut wie möglich zum Laufen gebracht habe:
In Windows Forms gibt es ein Ereignis namens,
KeyPress
das für diese Art von Aufgabe perfekt geeignet ist. In WPF gibt es das jedoch nicht. Stattdessen verwenden wir dasPreviewTextInput
Ereignis. Außerdem glaube ich, dass man für die Validierung eine verwenden kann, um die Bedingungforeach
zu durchlaufentextbox.Text
und zu überprüfen, ob sie übereinstimmt ;), aber ehrlich gesagt, dafür sind reguläre Ausdrücke gedacht.Noch eine Sache, bevor wir in den heiligen Code eintauchen . Damit das Ereignis ausgelöst wird, kann man zwei Dinge tun:
<PreviewTextInput="textBox_PreviewTextInput/>
Loaded
Falle des Formulars (in dem sich die Textbox befindet):textBox.PreviewTextInput += onlyNumeric;
Ich denke, die zweite Methode ist besser, weil Sie in solchen Situationen meistens dieselbe Bedingung (
regex
) auf mehrere anwenden müssenTextBox
und sich nicht wiederholen möchten! .Zum Schluss würden Sie Folgendes tun:
quelle
Hier ist meine Version davon. Es basiert auf einer Basisklasse
ValidatingTextBox
, die nur rückgängig macht, was getan wurde, wenn es nicht "gültig" ist. Es unterstützt Einfügen, Ausschneiden, Löschen, Rücktaste, +, - usw.Für 32-Bit-Ganzzahlen gibt es eine Int32TextBox-Klasse, die nur mit einer int verglichen wird. Ich habe auch Gleitkomma-Validierungsklassen hinzugefügt.
Hinweis 1: Wenn Sie die WPF-Bindung verwenden, müssen Sie sicherstellen, dass Sie die Klasse verwenden, die zum gebundenen Eigenschaftstyp passt. Andernfalls kann dies zu seltsamen Ergebnissen führen.
Hinweis 2: Wenn Sie Gleitkommaklassen mit WPF-Bindung verwenden, stellen Sie sicher, dass die Bindung die aktuelle Kultur verwendet, um mit der von mir verwendeten TryParse-Methode übereinzustimmen.
quelle
Hier ist eine Bibliothek für die numerische Eingabe in WPF
Es hat Eigenschaften wie
NumberStyles
undRegexPattern
zur Validierung.Unterklassen WPF
TextBox
quelle
Verwenden:
quelle
Ich habe mit einer ungebundenen Box für ein einfaches Projekt gearbeitet, an dem ich gearbeitet habe, daher konnte ich den Standardbindungsansatz nicht verwenden. Infolgedessen habe ich einen einfachen Hack erstellt, den andere möglicherweise sehr nützlich finden, indem sie einfach das vorhandene TextBox-Steuerelement erweitern:
Für einen Floating-Typ möchten Sie ihn natürlich als Float usw. analysieren. Es gelten die gleichen Grundsätze.
Dann müssen Sie in die XAML-Datei den relevanten Namespace aufnehmen:
Danach können Sie es als reguläre Steuerung verwenden:
quelle
Nachdem ich einige der Lösungen hier für einige Zeit verwendet hatte, entwickelte ich meine eigene, die für mein MVVM-Setup gut funktioniert. Beachten Sie, dass es nicht so dynamisch ist wie einige der anderen, da Benutzer weiterhin fehlerhafte Zeichen eingeben können, es sie jedoch daran hindert, die Taste zu drücken und somit etwas zu tun. Dies passt gut zu meinem Thema, Schaltflächen auszublenden, wenn Aktionen nicht ausgeführt werden können.
Ich habe eine,
TextBox
dass ein Benutzer eine Anzahl von Dokumentseiten eingeben muss, um gedruckt zu werden:... mit dieser verbindlichen Eigenschaft:
Ich habe auch einen Knopf:
... mit dieser Befehlsbindung:
Und dann gibt es die Methode von
SetNumberOfPages()
, aber es ist unwichtig für dieses Thema. In meinem Fall funktioniert dies gut, da ich der CodeBehind-Datei der Ansicht keinen Code hinzufügen muss und das Verhalten mithilfe derCommand
Eigenschaft steuern kann .quelle
Wenn Sie einen Zahlenwert überprüfen, können Sie die Funktion VisualBasic.IsNumeric verwenden.
quelle
In der WPF-Anwendung können Sie dies behandeln, indem Sie das
TextChanged
Ereignis behandeln:quelle
Für Entwickler, die möchten, dass ihre Textfelder nur vorzeichenlose Zahlen akzeptieren, z. B. Socket-Ports usw.:
WPF
C #
quelle
65535
. Wenn es größer ist, ist es kein gültiger Port. Das Setzen vonTextBox.MaxLength
to5
würde entweder programmgesteuert oder in XAML helfen .Dies ist, was ich verwenden würde, um ein WPF-Textfeld zu erhalten, das Ziffern und den Dezimalpunkt akzeptiert:
Fügen Sie den Code in eine neue Klassendatei ein und fügen Sie ihn hinzu
oben in der Datei und erstellen Sie die Lösung. Das numericTextBox-Steuerelement wird dann oben in der Toolbox angezeigt.
quelle