2010-04-04 5 views
6

Ho una semplice casella di testo in un'applicazione WPF.Determina quando e quale carattere viene aggiunto o eliminato in una casella di testo

Ho bisogno di sapere quando è stato aggiunto un personaggio/eliminata nella casella di testo, che carattere e dove è stato aggiunto o eliminato.

ho pensato di usare l'evento TextBox.KeyDown, ma ha qualche problema:

  • non posso sapere dove è stato aggiunto o eliminato il carattere.
  • Non ho idea di come determinare quale carattere è stato aggiunto (dallo KeyEventArgs).

Qualche idea?

risposta

8

Trovato la soluzione. In WPF, l'evento TextBox.TextChanged ha un TextChangedEventArgs. In questa classe, c'è una proprietà denominata Changes.

Ecco il mio codice:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    foreach (var change in e.Changes) 
    { 
     if (change.AddedLength > 0 && change.RemovedLength == 0) 
     { 
      if (change.AddedLength == 1) 
      { 
       AddCharacter(textBox1.Text[change.Offset], change.Offset); 
      } 
      else 
      { 
       AddString(textBox1.Text.Substring(change.Offset, change.AddedLength), change.Offset); 
      } 
     } 
     else if (change.AddedLength == 0 && change.RemovedLength > 0) 
     { 
      if (change.RemovedLength == 1) 
      { 
       RemoveCharacter(change.Offset); 
      } 
      else 
      { 
       RemoveString(change.Offset, change.RemovedLength + change.Offset); 
      } 
     } 
     else if (change.AddedLength == 1 & change.RemovedLength == 1) 
     { 
      ReplaceCharacter(change.Offset, textBox1.Text[change.Offset]); 
     } 
     else 
     { 
      ReplaceString(change.Offset, change.Offset + change.RemovedLength, textBox1.Text.Substring(change.Offset, change.AddedLength)); 
     } 
    } 
} 

Ora ho solo bisogno di aspettare due giorni per accettare questa risposta. :)

Grazie comunque.

+1

no, risposta brillante (quindi +1), ma la proprietà non è in silverlight (perché ?! –

+1

Cos'è tutto questo ... "AddCharacter" e "AddString" shenanigans che stai facendo? Non ho quei metodi ... – Pojo

2

È possibile utilizzare un metodo "forza bruta": la casella di testo (in Winform e penso anche in WPF) ha un evento di testo modificato che è possibile utilizzare e confrontando il testo prima dell'evento e il testo corrente che è possibile trova quale personaggio è stato aggiunto o rimosso.

+0

Non sarebbe slooooooow? Può essere due o tre parole ma può essere un documento completo. –

+0

Ogni volta che un solo carattere ha delle modifiche - quindi non dovrebbe essere troppo lento - ma ci deve essere una soluzione migliore –

Problemi correlati