2012-04-20 26 views
6

Estoy creando un formulario en una aplicación C# WinRT, y me gustaría restringir los caracteres en uno de los componentes del TextBox a números solamente. (Este TextBox sería para que un usuario ingrese un año).Restricción de caracteres en un TextBox

He buscado por un tiempo, pero no he podido encontrarlo sin configurar un detector de eventos en el evento TextChanged, y inspeccionando la propiedad text en cada pulsación de tecla. ¿Hay alguna forma de decir simplemente que un usuario solo puede ingresar caracteres específicos en un TextBox?

Respuesta

8

Lo más sencillo que podría posiblemente el trabajo es para unirse al evento OnTextChanged y modificar el texto según sus reglas.

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

Sin embargo, me asusto de este enfoque, ya que el mantra de Metro es toque primera interfaz de usuario y fácil puede hacerlo en una primera forma táctil con un control FlipView.

+0

Marcando esto como la respuesta, ya que en su mayoría resuelve el problema que estaba teniendo. Esto restringirá el TextBox a solo mostrar números. Sin embargo, desde entonces revisé esta parte de mi aplicación y reemplacé el campo del año con un ComboBox, para eludir por completo el problema. (Tengo un rango fijo de años posible, así que no sé por qué no usé un ComboBox en primer lugar.) –

-2

Utilice un control MaskedTextBox. Para números solamente, solo use la propiedad Máscara para especificar los caracteres y la longitud, si corresponde. p.ej. si solo desea ingresar cinco números, configure la propiedad de la máscara como "00000". Simple como eso. Windows maneja la restricción por ti.

+1

¿Hay un MaskedTextBox para WinRT? –

+0

@RitchMelton No lo sé en este momento. Supongo que la respuesta debería ser sí. – olatunjee

+0

Los documentos actuales dicen que no. http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx –

0

Año Válido

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

no válida Año

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

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

6

Intente configurar la propiedad TextBox.InputScope en InputScopeNameValue.Number, como se menciona en Guidelines and checklist for text input en MSDN.

+0

Esto es genial, y (algo así como) existe en WPF también. No sabía sobre este. ¡Gracias! –

+0

+1 para una función clara –

+1

Esto funciona un poco, pero no hará exactamente lo que estoy tratando de lograr. Parece que la propiedad InputScope sirve más como una sugerencia para el sistema sobre qué teclado suave debe mostrar el sistema, pero no creará un TextBox enmascarado que limite las entradas. (Finalmente encontré este hilo en los foros de MSDN - enlace a continuación, ver la publicación de Chipalo Street, del jueves, 22 de marzo de 2012 a las 5:49 p.m.). http://social.msdn.microsoft.com/Foros/en-US/winappswithcsharp/thread/d746d7d7-91c7-4429-8efa-a748b4ce6a03 –

0

Esto parece funcionar para mí:

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

Consulte la documentación de la VirtualKey enumeration para todos los valores.

0

Basado en una publicación en link, agregando la pestaña para permitir la navegación.

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

Shift-4, que debería ser un signo de dólar, no se filtra con este código. La tecla 4 se ve y acepta como un dígito. Consulte esta pregunta: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event donde se muestran varios métodos para detectar el cambio, el control, etc. ., llaves. –

Cuestiones relacionadas