2011-10-27 15 views
8

Estoy trabajando en una aplicación web Silverlight. Interactúa con un módulo que envía SMS. Quiero limitar el texto a 160 y mostrar un contador. Lo hice así:Detección de retroceso en KeyDown

public partial class SendSMSView 
{ 
    public SendSMSView() 
    { 
     InitializeComponent(); 
     ApplyTheme(); 
    } 

    protected void tbMessage_KeyDown(object sender, KeyEventArgs e) 
    { 
     count = 160 - this.tbMessage.Text.Length; 
     this.lblCount.Content = count.ToString(); 
    } 
} 

Esto funciona bien para todas las teclas excepto para retroceder y eliminar. Por supuesto, está hecho para funcionar así. Cavé más en este caso y trató de anular keydown por lo que añade el siguiente fragmento de código:

public class CustomTextBox : TextBox 
{ 
    public CustomTextBox(): base() 
    { 
    } 

    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     e.handler=false; 
     base.OnKeyDown(e); 
     //this place 
    } 
} 

En función OnKeyDown consigo todas las pulsaciones de teclas registradas. Establecer Handler en false aquí no ayuda y todavía no puedo tener retroceso para activar tbMessage_KeyDow.

Quiero de alguna manera llamar a la función tbMessage_KeyDow desde // este lugar con fuerza desde allí para el retroceso.

Busqué en MSDN, y encontré que IsInputKey puede ser reemplazado para que sea verdadero, de modo que onKeyDown responda a él también, pero My framework no tiene IsInputKey ni PreviewKeyPress. ¿Hay alguna solución para obtener la clave de retroceso registrada como clave de entrada, o para llamar a tbMessage_KeyDow [que es un enfoque muy crudo]? Por favor ayuda.

+0

Dado que está utilizando los espacios posteriores 'this.tbMessage.Text.Length' y eliminar se reflejará en la cadena' Text'. ¿O quieres decir algo más? – Stefan

+1

¿por qué no utiliza el evento [textchanged] (http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.textchanged%28v=vs.95%29.aspx) en lugar de la combinación de teclas? solo cuente el contenido de la caja de texto cada vez que cambie – weberik

+0

Gracias. TextChanged funcionó, después de un poco de manipulación. – whizzyifti

Respuesta

8

probar esto ....

Si desea detectar la tecla de retroceso en la tecla pulsada en un cuadro de texto. le sugerimos que intente hacer en el evento KeyUp del cuadro de texto en lugar del evento KeyDown. por ejemplo:

<TextBox x:Name="txt" KeyDown="txt_KeyDown" Text="Hello" KeyUp="txt_KeyUp"></TextBox>  

el código subyacente:

private void txt_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Back) 
     { 
      MessageBox.Show(this.txt.Text); 
     } 
    } 

o puede hacerlo así ... mediante la creación de un control de usuario ....

public partial class Page : UserControl { 

    private TextBox TextBox1; 

    public Page() { 
     InitializeComponent(); 
     TextBox1 = new TextBox(); 
     Width = 300; 
     Height = 100; 
     LayoutRoot.Children.Add(textbox); 
     OnTextChanged(((object)(sender)), ((TextChangedEventArgs)(e))); 
     TextBox1.TextChanged; 
     if (e.Key == Key.Back) { 
      e.Handled = true; 
     } 
     else if (e.Key == Key.Delete) { 
      e.Handled = true; 
     } 
    } 
} 
0

me gustaría hacer algo así (no tengo VS frente a mí, así que este es el código pseduo puro)

public class SendSMSViewModel : INotifyPropertyChanged 
{ 
    string _text; 

    public string Text 
    { 
     get { return _text; } 
     set { 

      // or allow it and implement IDataErrorInfo to give the user a nifty error message   
      if (value != null & value.Length > 160) 
       return; 

      _text = value; 
      OnPropertyChanged(vm => vm.Text); 
      OnPropertyChanged(vm => vm.NumberOfCharactersRemaining); 
    } 
    } 

    public string NumberOfCharactersRemaining 
    { 
     get { return Text == null ? 160 : 160 - Text.Length; } 
    } 
} 

... y luego use la unión de datos bidireccional de su vista y recuerde usar UpdateSourceTrigger de "PropertyChanged" en sus enlaces.

+0

Gracias, la implementación de ViewModel funciona, de hecho lo he hecho muchas veces antes. Estaba tratando de evitar el código adicional para resolverlo en View.cs – whizzyifti