2016-02-03 9 views
5

ich eine UWP app bin zu schaffen, die Zahlen unterschiedliche Textfelder hat einzugeben. Um sicherzustellen, dass nur Zahlen eingegeben werden können, verwende ich das TextChanging-Ereignis. Leider kann ich keine Dokumentation darüber finden, wie man TextChanging im Detail benutzt, um falsche Eingaben zu ignorieren.UWP TextBox.TextChanging Verwendung falscher Daten zu ignorieren

für TextBox Eine Arbeitslösung ist folgende:

string oldText; 
private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
{ 
    double temp; 
    if (double.TryParse(sender.Text, out temp) || sender.Text == "") 
     oldText = sender.Text; 
    else 
    { 
     int pos = sender.SelectionStart - 1; 
     sender.Text = oldText; 
     sender.SelectionStart = pos; 
    } 
} 

diese Lösung würde ich für jeden TextBox ein string oldText benötigen und entweder auch eine TextChanging Funktion für jeden von ihm oder viel mehr Code innerhalb der Funktion .

Gibt es eine einfache Möglichkeit, „falsche“ Eingaben im TextBox.TextChanging Ereignisse zu ignorieren?

+0

Sind Sie sich bewusst * InputScopes *? Sie können auch einen Blick auf diese Antwort werfen (http://stackoverflow.com/a/21193669/2681948) - vielleicht wird es helfen. – Romasz

+0

Ich habe bereits das _InputScope_ auf "Number" gesetzt, aber auf dem PC kann ich noch Buchstaben eingeben ... Ihr Link sieht gut aus, ich werde es versuchen. – daengl

+0

Es gibt wahrscheinlich einige Möglichkeiten, wie Sie diese Aufgabe bewältigen können. Außerdem müssen Sie wahrscheinlich mit dem Fall umgehen, wenn Benutzer einen Text kopieren und einfügen. – Romasz

Antwort

9

Mit Hilfe Romasz Link in seinem ersten Kommentar kam ich mit dieser Lösung:

private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
{ 
    double dtemp; 
    if (!double.TryParse(sender.Text, out dtemp) && sender.Text != "") 
    { 
     int pos = sender.SelectionStart - 1; 
     sender.Text = sender.Text.Remove(pos, 1); 
     sender.SelectionStart = pos; 
    } 
} 

Diese Ausnahme ganz gut funktioniert, wenn ein Teil des Eingangswertes ausgewählt wird und dann ein falsche Zeichen eingegeben wird.

Edit: I verbessert die obige Version Regex zu verwenden. So, jetzt bin ich in der Lage zu überprüfen, was Inhalt erlaubt sein sollte, ein:

private void tbInput_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args) 
{ 
    if (!Regex.IsMatch(sender.Text, "^\\d*\\.?\\d*$") && sender.Text != "") 
    { 
     int pos = sender.SelectionStart - 1; 
     sender.Text = sender.Text.Remove(pos, 1); 
     sender.SelectionStart = pos; 
    } 
} 
+0

Vielen Dank für diese Lösung. Ich habe kein Problem "wenn ein Teil der Eingabe ausgewählt ist und dann ein falsches Zeichen eingegeben wird" ... scheint es gut zu funktionieren. Ich werde versuchen, seine Funktionalität mit altem Code zu verbessern. – none

0

Versuchen Sie das Ereignis PreviewTextInput zu verwenden, das TextCompositionEventArgs mit einer Handled-Eigenschaft übergibt, die im Routing des Ereignisses verwendet werden kann, um die Implementierung des Basissteuerelements durch Festlegen von Handled = true zu unterbrechen.

+1

Das klingt ziemlich gut, leider hat die UWP TextBox kein PreviewTextInput Ereignis – daengl

+0

Das ist sicherlich eine enttäuschende Wende, sorry, dass ich meine Workstation mit VS2015 nicht zur Verfügung hatte, als ich sie schrieb. – user5606561

+0

Es gibt keine VorschauEvents in UWP überhaupt - nicht nur in der TextBox. –

Verwandte Themen