2016-02-03 28 views
5

Tworzę aplikację UWP, która ma różne pola tekstowe do wprowadzania liczb. Aby upewnić się, że można wprowadzać tylko liczby, używam zdarzenia TextChanging. Niestety nie mogę znaleźć żadnej dokumentacji dotyczącej szczegółowego korzystania z funkcji TextChanging w celu zignorowania błędnych danych wejściowych.Używanie UWP TextBox.TextChanging do ignorowania niewłaściwych danych

roztworu roboczego dla jednego TextBox jest następujący:

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; 
    } 
} 

Stosując to rozwiązanie byłoby muszę string oldText dla każdego TextBox i albo też funkcja TextChanging dla każdego z nich lub dużo więcej kodu wewnątrz funkcji .

Czy istnieje prosty sposób na zignorowanie "niewłaściwych" danych wejściowych w zdarzeniu TextBox.TextChanging?

+0

Czy znasz * InputScopes *? Możesz również rzucić okiem [pod tą odpowiedzią] (http://stackoverflow.com/a/21193669/2681948) - może ci pomoże. – Romasz

+0

Już ustawiłem _InputScope_ na '" Number "', ale na komputerze wciąż mogę wpisywać litery ... Twój link wygląda dobrze, spróbuję w ten sposób. – daengl

+0

Prawdopodobnie istnieje kilka sposobów na obsłużenie tego zadania. Prawdopodobnie będziesz musiał obsłużyć przypadek, gdy użytkownik skopiuje i wklei tekst. – Romasz

Odpowiedz

9

Z pomocą Romasz ogniwo w swoim pierwszym komentarzu wymyśliłem tego rozwiązania:

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; 
    } 
} 

Działa to całkiem dobrze, z wyjątkiem gdy część wartości wejściowej jest zaznaczona, a następnie źle znak jest wpisany.

Edytuj: Poprawiłem powyższą wersję, aby używać Regex. Teraz mogę sprawdzić, czy treść powinna być dozwolona:

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

Dziękuję za to rozwiązanie. Nie mam żadnego problemu "gdy część wejścia jest wybrana, a następnie wprowadzony jest zły znak" ... wydaje się działać dobrze. Spróbuję poprawić jego funkcjonalność za pomocą starego kodu, który otrzymałem. – none

0

Spróbuj użyć zdarzenia PreviewTextInput, które przekazuje właściwość TextCompositionEventArgs z właściwością Handled, która może być używana w routingu zdarzenia w celu zawieszenia implementacji formantu podstawowego przez ustawienie Handled = true.

+1

To brzmi całkiem nieźle, niestety panel tekstowy UWP nie ma zdarzenia PreviewTextInput. – daengl

+0

To z pewnością rozczarowujący zwrot, przykro mi, że nie miałem swojej stacji roboczej z VS2015 dostępnej w czasie, kiedy ją pisałem. – user5606561

+0

W UWP nie ma obiektów PreviewEvent - nie tylko w TextBox. –