C#: невозможно отменить вставленный текст

Я программно добавляю текст в пользовательский RichTextBox, используя событие KeyPress:

SelectedText = e.KeyChar.ToString(); 

Проблема в том, что вставка текста таким способом не вызывает флаг CanUndo.

Таким образом, когда я пытаюсь отменить / повторить текст (вызывая методы Undo() и Redo() текстового поля), ничего не происходит.

Я попытался программно вызвать событие KeyUp() из события TextChanged(), но это все еще не помечало CanUndo как true.

Как я могу отменить вставленный текст, не создавая списки для операций отмены и возврата?

Спасибо

3 ответа

Решение

В конце концов я решил создать свою собственную систему отмены и восстановления, используя стеки.

Вот краткий обзор того, как я это сделал:

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();  
}

Это всего лишь идея, но что, если вы установите позицию каретки в то место, куда вы вставите свой текст, и вместо того, чтобы изменять свойство Text, просто отправьте ключи?

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

Должны быть причуды, но, как я уже сказал, это просто идея.

Вы можете использовать TestBox.Paste. Документация в обзоре классов, гласящая "Устанавливает выделенный текст в указанный текст без очистки буфера отмены", кажется запутанной. Я только что попробовал это, и это устанавливает Отмену, как ожидалось.

Несмотря на свое название, он вообще не имеет отношения к буферу обмена, он просто заменяет выбранный в настоящее время текст текстом, который вы предоставляете в качестве аргумента, и, следовательно, кажется, просто выполняет то, о чем просит вопрос, очень простым способом.

Другие вопросы по тегам