2011-03-24 45 views
6

我使用的按键事件编程方式添加文本在自定义的RichTextBox:C#:无法撤消插入的文本

SelectedText = e.KeyChar.ToString(); 

的问题是,以这样的方式插入文本不会触发CanUndo标志。因此,当我尝试撤消/重做文本(通过调用文本框的Undo()和Redo()方法)时,什么都不会发生。

我尝试从一个TextChanged()事件中编程唤起KeyUp()事件,但仍然没有将CanUndo标记为true。

如何撤消我插入的文本,而不必为撤消和重做操作创建列表?

感谢

回答

3

我终于决定使用堆栈创建自己的undo-redo系统。

这里是我是如何做到的简要概述:

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

如果设置插入符位置,你会插入你的文字,而是修改文本属性的这只是一个想法,但什么,只是send the keys

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

有一定会有怪癖,但正如我所说,这只是一个想法。

+0

谢谢,但由于某种原因,仍然没有触发CanUndo标志。 – 2011-03-24 16:02:34

+0

无赖,值得拍摄的权利:-) – Peter 2011-03-25 07:07:12

0

您可以使用TestBox.Pasteclass overview中的文档称“将选定文本设置为指定文本而不清除撤消缓冲区”似乎令人困惑。我刚刚尝试过,并按预期设置撤消。

尽管它的名字与剪贴板没有任何关系,它只是用当前选定的文本替换为您提供的文本作为参数,因此似乎只是以非常简单的方式来执行问题所要求的内容。