2011-03-24 71 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中的文檔稱「將選定文本設置爲指定文本而不清除撤消緩衝區」似乎令人困惑。我剛剛嘗試過,並按預期設置撤消。

儘管它的名字與剪貼板沒有任何關係,它只是用當前選定的文本替換爲您提供的文本作爲參數,因此似乎只是以非常簡單的方式來執行問題所要求的內容。