2012-04-20 12 views
6

Sto costruendo un modulo in un'app C# WinRT e vorrei limitare i caratteri di uno dei componenti di TextBox ai soli numeri. (Per un utente è possibile inserire un anno in questo riquadro di testo.Limitazione dei caratteri in un TextBox

Ho cercato un po ', ma non sono stato in grado di capirlo senza impostare un listener di eventi sull'evento TextChanged e ispezionare la proprietà text a ogni pressione di un tasto. C'è un modo per dire semplicemente che un utente può inserire solo caratteri specifici in un TextBox?

risposta

8

La cosa più semplice che poteva funzionare è quello di legarsi alla manifestazione OnTextChanged e modificare il testo in base alle proprie regole.

<TextBox x:Name="TheText" TextChanged="OnTextChanged" MaxLength="4"/> 
private void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (TheText.Text.Length == 0) return; 

     var text = TheText.Text; 

     int result; 
     var isValid = int.TryParse(text, out result); 
     if (isValid) return; 

     TheText.Text = text.Remove(text.Length - 1); 
     TheText.SelectionStart = text.Length; 
    } 

Tuttavia, mi piacerebbe rifuggire da questo approccio in quanto il mantra di Metro è tocco prima UI e facile lo si può fare in una prima maniera tocco con un controllo FlipView.

+0

Contrassegnare questo come la risposta in quanto risolve principalmente il problema che stavo avendo. Ciò limiterà il TextBox a visualizzare solo numeri. Tuttavia, ho rivisitato questa parte della mia app e sostituito il campo dell'anno con un ComboBox, per eludere completamente il problema. (Ho un intervallo di anni prefissato possibile, quindi non so perché non ho usato un ComboBox in primo luogo.) –

-2

Utilizzare un controllo MaskedTextBox. Solo per i numeri, basta usare la proprietà Mask per specificare i caratteri e la lunghezza, se ce ne sono. per esempio. se vuoi inserire solo cinque numeri, imposta la proprietà mask su "00000". Semplice come quella. Windows gestisce la restrizione per te.

+1

Esiste un MaskedTextBox per WinRT? –

+0

@ RitchMelton Non lo so al momento. Credo che la risposta dovrebbe essere sì. – olatunjee

+0

I documenti attuali dicono di no. http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx –

0

Anno valido

DateTime newDate; 
var validYear = DateTime.TryParseExact("2012", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //valid 

valido Anno

var validYear = DateTime.TryParseExact("0000", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //invalid 
+0

http://stackoverflow.com/editing-help#code –

6

Provare a impostare la proprietà TextBox.InputScope su InputScopeNameValue.Number, come indicato in Guidelines and checklist for text input in MSDN.

+0

Questo è interessante, e (sort-of) esiste anche in WPF. Non sapevo di questo. Grazie! –

+0

+1 per una bella funzionalità –

+1

Questo tipo funziona, ma non farà esattamente quello che sto cercando di realizzare. Sembra che la proprietà InputScope serva più come suggerimento al sistema su quale tastiera software debba essere visualizzata dal sistema, ma non creerà un TextBox mascherato che limita gli input. (Finalmente trovato questo thread nei forum MSDN - link sotto, vedi post da Chipalo Street, da giovedì 22 marzo 2012 17:49). http://social.msdn.microsoft.it/Forum/it-US/winappswithcsharp/thread/d746d7d7-91c7-4429-8efa-a748b4ce6a03 –

0

Questo sembra funzionare per me:

private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     if ((e.Key < VirtualKey.Number0) || (e.Key > VirtualKey.Number9)) 
     { 
      // If it's not a numeric character, prevent the TextBox from handling the keystroke 
      e.Handled = true; 
     } 
    } 

vedere la documentazione per il VirtualKey enumeration per tutti i valori.

0

In base a un messaggio su link, aggiungere la scheda per consentire la navigazione.

private void decimalTextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     bool isGoodData; // flag to make the flow clearer. 
     TextBox theTextBox = (TextBox)sender; // the sender is a textbox 

     if (e.Key>= Windows.System.VirtualKey.Number0 && e.Key <= Windows.System.VirtualKey.Number9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Tab) 
      isGoodData = true; 
     else if (e.Key >= Windows.System.VirtualKey.NumberPad0 && e.Key <= Windows.System.VirtualKey.NumberPad9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Decimal || (int)e.Key == 190) // character is a decimal point, 190 is the keyboard period code 
                        // which is not in the VirtualKey enumeration 
     { 
      if (theTextBox.Text.Contains(".")) // search for a current point 
       isGoodData = false; // only 1 decimal point allowed 
      else 
       isGoodData = true;  // this is the only one. 
     } 
     else if (e.Key == Windows.System.VirtualKey.Back) // allow backspace 
      isGoodData = true; 
     else 
      isGoodData = false; // everything else is bad 
     if (!isGoodData)   // mark bad data as handled 
      e.Handled = true; 
    } 
+1

Maiusc-4, che dovrebbe essere un segno di dollaro, non è filtrato con questo codice. Il 4 tasto è visto e accettato come una cifra. Vedi questa domanda: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event dove vengono mostrati vari metodi per rilevare lo spostamento, il controllo, ecc. ., chiavi. –

Problemi correlati