2016-02-03 34 views
5

Sto creando un'app UWP con diversi TextBox per immettere numeri. Per essere sicuro che possano essere inseriti solo numeri, uso l'evento TextChanging. Purtroppo non riesco a trovare alcuna documentazione su come utilizzare TextChanging in dettaglio per ignorare gli input errati.Utilizzo di UWP TextBox.TextChanging per ignorare i dati errati

una soluzione di lavoro per una TextBox è la seguente:

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

Utilizzando questa soluzione avrei bisogno di un string oldText per ogni TextBox e sia anche una funzione TextChanging per ciascuno di esso o molto di più di codice all'interno della funzione .

C'è un modo semplice per ignorare gli input "errati" nell'evento TextBox.TextChanging?

+0

Sei a conoscenza di * InputScopes *? Puoi anche dare un'occhiata [a questa risposta] (http://stackoverflow.com/a/21193669/2681948) - forse ti aiuterà. – Romasz

+0

Ho già impostato _InputScope_ su '" Number "' ma sul PC posso ancora inserire lettere ... Il tuo link sembra buono, proverò in questo modo. – daengl

+0

Ci sono probabilmente un paio di modi in cui puoi gestire questa attività. Inoltre, probabilmente dovrai gestire il caso quando l'utente copia e incolla un testo. – Romasz

risposta

9

Con l'aiuto di collegamento Romasz nel suo primo commento mi si avvicinò con questa soluzione:

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

Questo funziona abbastanza bene, tranne quando si seleziona una parte del valore di ingresso e poi viene immesso un carattere errato.

Modifica: Ho migliorato la versione precedente per utilizzare Regex. Così ora sono in grado di controllare qualsiasi contenuto dovrebbe essere consentito di inserire:

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

Grazie per questa soluzione. Non ho alcun problema "quando una parte di input è selezionata e quindi viene inserito un carattere errato" ... sembra che funzioni bene. Proverò a migliorare le sue funzionalità con il vecchio codice che ho ottenuto. – none

0

Provare a utilizzare l'evento PreviewTextInput che passa TextCompositionEventArgs con una proprietà Handled che può essere utilizzata nel routing dell'evento per sospendere l'implementazione del controllo di base impostando Handled = true.

+1

Suona abbastanza bene, purtroppo UWP TextBox non ha un evento PreviewTextInput – daengl

+0

Questo è certamente un giro deludente, mi dispiace non aver avuto la mia workstation con VS2015 disponibile al momento in cui l'ho scritta. – user5606561

+0

Non ci sono in alcun modo PreviewEvents in UWP - non solo nel TextBox. –