Rilevamento di Backspace KeyDown

Sto lavorando su una silverlight web app. Interagisce con un modulo che invia SMS. Voglio limitare il testo di 160 e mostra un contatore. Ho fatto così:

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

Questo funziona bene per tutti i tasti tranne il tasto backspace e canc. Ovviamente è fatto per funzionare così. ho scavato di più su questo e ho cercato di override evento keydown così ho aggiunto il seguente frammento di codice:

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

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

In OnKeyDown funzione ho tutti i tasti registrati. Impostazione del Gestore di false qui non aiuta e ancora non riesco a ottenere backspace per attivare tbMessage_KeyDow.

Voglio in qualche modo chiamare il tbMessage_KeyDow funzione da //a questo posto con forza da lì per il backspace.

Ho cercato su MSDN, e ha scoperto che isinputkey si può essere ridefinito per restituire true in modo che onKeyDown risponde bene, ma il Mio quadro non ha né isinputkey si PreviewKeyPress. C’è una soluzione per ottenere il tasto backspace registrato come tasto di input, o di chiamare tbMessage_KeyDow [che è molto grezzo approccio] ? Si prega di aiuto.

  • Dal momento che si sta utilizzando this.tbMessage.Text.Length i caratteri di backspace e canc essere riflessa nella stringa Text. O intendi qualcos’altro?
  • perchè non utilizzare il textchanged evento keydown? basta contare il contenuto della casella di testo ogni volta che è cambiato
  • Grazie. TextChanged lavorato, dopo un po ‘ di smanettamento.
InformationsquelleAutor whizzyifti | 2011-10-27

 

3 Replies
  1. 12

    provare questo ….

    Se si desidera rilevare il tasto backspace al tasto premuto in una casella di testo. vorremmo suggerire che si può provare a fare nella casella di testo l’evento KeyUp invece che l’evento KeyDown.
    per esempio:

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

    codebehind:

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

    o si può fare come this…by creazione di un controllo utente….

    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;
            }
        }
    }
  2. 1

    Stavo cercando qualcosa di simile per un’applicazione WPF, Backspace e Canc non erano stati catturati da evento KeyDown. L’evento KeyUp non era praticabile, bc sarebbe prendere la pressione di un tasto DOPO l’azione si era già verificato.

    Trovato, tuttavia, che PreviewKeyDown evento lavorato per catturare la pressione di un tasto, in modo che io possa evitare che la pressione che si verificano, in questo modo:

    private void txtRight_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if ((e.Key == Key.Delete) || (e.Key == Key.Back))
        {
            //Stop the character from being entered into the control since it is illegal.
            e.Handled = true;
        }
    }
  3. 0

    Vorrei fare qualcosa di simile a questo (non ho VS davanti a me, così questo è puro pseduo codice)

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

    ..e quindi due modi diversi di associazione dati dal vostro punto di vista e ricordarsi di utilizzare un UpdateSourceTrigger di “PropertyChanged” sul vostro associazioni.

    • Grazie, Il ViewModel la Realizzazione di opere, infatti ho fatto molte volte prima. Stavo cercando di evitare di codice extra a lavorare in Vista.cs

Lascia un commento