2011-03-24 11 views
6

Estoy añadiendo programáticamente texto en un RichTextBox personalizado mediante un evento KeyPress:C#: No se puede deshacer inserta el texto

SelectedText = e.KeyChar.ToString(); 

El problema es que la inserción de texto de tal manera no se activa la bandera canUndo.

Como tal, cuando intento Deshacer/Rehacer texto (llamando a los métodos Deshacer() y Rehacer() del cuadro de texto), no pasa nada.

Intenté llamar programáticamente el evento KeyUp() desde dentro de un evento TextChanged(), pero eso todavía no marcó CanUndo en verdadero.

¿Cómo puedo deshacer el texto que inserté sin tener que crear listas para operaciones de deshacer y rehacer?

Gracias

Respuesta

3

Finalmente, decidí crear mi propio sistema de deshacer-rehacer usando pilas.

He aquí una breve descripción de cómo lo hice:

private const int InitialStackSize = 500;  
private Stack<String> undoStack = new Stack<String>(InitialStackSize); 
private Stack<String> redoStack = new Stack<String>(InitialStackSize); 

private void YourKeyPressEventHandler(...) 
{ 
     // The user pressed on CTRL - Z, execute an "Undo" 
     if (e.KeyChar == 26) 
     { 
      // Save the cursor's position 
      int selectionStartBackup = SelectionStart; 

      redoStack.Push(Text); 
      Text = undoStack.Pop(); 

      // Restore the cursor's position 
      SelectionStart = selectionStartBackup; 
     } 
     // The user pressed on CTRL - Y, execute a "Redo" 
     if (e.KeyChar == 25) 
     { 
      if (redoStack.Count <= 0) 
       return; 

      // Save the cursor's position 
      int selectionStartBackup = SelectionStart + redoStack.ElementAt(redoStack.Count - 1).Length; 

      undoStack.Push(Text); 
      Text = redoStack.Pop(); 

      // Restore the cursor's position 
      SelectionStart = selectionStartBackup; 

      return; 
     }  

     undoStack.Push(Text); 
     SelectedText = e.KeyChar.ToString(); 
} 
1

Es sólo una idea, pero lo que si se establece la posición de intercalación a donde desea insertar el texto y en lugar de modificar la propiedad de texto, simplemente send the keys?

SendKeys.Send("The keys I want to send"); 

Es probable que existan peculiaridades, pero como he dicho, es solo una idea.

+0

Gracias, pero eso todavía no activó la bandera de CanUndo por algún motivo. –

+0

Bummer, valió la pena intentarlo :-) – Peter

0

Puede utilizar TestBox.Paste. La documentación en el class overview, que dice "Establece el texto seleccionado en el texto especificado sin borrar el búfer de deshacer", parece confuso. Acabo de probarlo y establece el Deshacer como se esperaba.

A pesar de su nombre no tiene ninguna relación con el Portapapeles en absoluto, simplemente reemplaza el texto seleccionado actualmente con el texto que proporciona como argumento, y por lo tanto parece hacer simplemente lo que la pregunta pide, de manera muy simple .

Cuestiones relacionadas