C#RichTextBox:突出显示&x2B;撤消

C#RichTextBox:突出显示&x2B;撤消,c#,richtextbox,undo,C#,Richtextbox,Undo,我正在做一个带有语法高亮显示的简单xhtml编辑器。 问题是richtextbox中的撤消历史记录存储了所有内容。甚至我的突出显示也会改变。 我已经发现有一个richtextbox.UndoActionName,如果通过编程更改richtextbox,它应该是“未知”的。所以当按下ctrl+z时,我尝试了如下操作: while(richtextbox.CanUndo && richtextbox.UndoActionName == "Unknown"){ richtext

我正在做一个带有语法高亮显示的简单xhtml编辑器。 问题是richtextbox中的撤消历史记录存储了所有内容。甚至我的突出显示也会改变。 我已经发现有一个
richtextbox.UndoActionName
,如果通过编程更改richtextbox,它应该是“未知”的。所以当按下ctrl+z时,我尝试了如下操作:

while(richtextbox.CanUndo && richtextbox.UndoActionName == "Unknown"){
    richtextbox.Undo();
}
它只是选择了我的整个文本,实际上并没有撤销任何内容(只是一直循环,直到我停止它…)。 所以我的问题是,我是否需要自己指定undoactionname,或者我是否可以将richtextbox更改为仅为键入而记录撤消历史? 谢谢

编辑:如果我可以向richtextbox发送一条消息,在高亮显示时停止记录撤消历史记录,或者以某种方式排除未知名称的操作,那就太酷了,有什么方法可以做到这一点吗


编辑2:我用了一种愚蠢的方式,我将整个文本存储在链表中,在重做时,我清除richtextbox并用列表中的最后一项填充它,然后重新突出显示。可能这对任何人都有帮助,问题是您正在尝试撤消上一个操作,这将是对下一个操作的撤消,因此它将继续这样做

试试这个:

while(richtextbox.CanUndo) {
  richtextbox.Undo();
  // Clear the undo buffer to prevent last action from being
  richtextbox.ClearUndo();
}

我稍后会试试,但我认为这不管用。这将撤消最后一个操作(很可能是语法高亮显示),然后清除撤消缓冲区。我想跳过所有突出显示语法的更改,并撤消键入更改。或者ClearUndo()是否只删除历史上最后一个撤销项?我用了一种愚蠢的方法,我将整个文本存储在链表中,在重做时,我清除richtextbox并用列表中的最后一项填充它,然后重新突出显示。也许这对任何人都有帮助。