C# RichTextBox: выделение + отмена

Я делаю простой редактор xhtml с подсветкой синтаксиса. Проблема в том, что в истории отмены RichTextBox хранится все. Даже моя подсветка меняется. Я уже обнаружил, что есть richtextbox.UndoActionName, который должен быть «Неизвестным», если вы изменяете форматированный текст программно. Итак, я попробовал что-то вроде этого при нажатии ctrl+z:

while(richtextbox.CanUndo && richtextbox.UndoActionName == "Unknown"){
    richtextbox.Undo();
}

Который просто выбрал весь мой текст и фактически ничего не отменял (просто продолжал зацикливаться, пока я не остановил его...). Итак, мой вопрос в том, нужно ли мне где-то указывать имя отмены самостоятельно или я могу изменить RichTextBox для записи истории отмены только для ввода? Спасибо.

Редактировать: Было бы здорово, если бы я мог отправить сообщение в richtextbox, чтобы остановить запись истории отмен, пока я выделяю, или каким-то образом исключить действия с неизвестным именем, есть ли способ сделать это?

Редактировать 2: Ну, я сделал это глупым способом, я сохраняю весь текст в связанном списке, и при повторении я очищаю RichTextBox и заполняю его последним элементом из списка, а затем повторно выделять. Может кому это поможет


person haluzak    schedule 16.05.2011    source источник
comment
Ну, я сделал это глупо, я сохраняю весь текст в связанном списке, и при повторении я очищаю RichTextBox и заполняю его последним элементом из списка, а затем повторно выделяю. Может быть, это кому-нибудь поможет.   -  person haluzak    schedule 16.05.2011


Ответы (1)


Проблема в том, что вы пытаетесь отменить последнее действие, которое будет отменено для следующей операции, поэтому оно будет продолжать это делать.

Попробуй это:

while(richtextbox.CanUndo) {
  richtextbox.Undo();
  // Clear the undo buffer to prevent last action from being
  richtextbox.ClearUndo();
}
person user695663    schedule 16.05.2011
comment
Я попробую это позже, но я не думаю, что это сработает. Это отменит последнее действие (скорее всего, подсветку синтаксиса), а затем очистит буфер отмены. Я хочу пропустить все изменения подсветки синтаксиса и отменить изменения ввода. Или ClearUndo() удаляет только последний элемент отмены в истории? - person haluzak; 16.05.2011