C #: невозможно отменить вставленный текст - PullRequest
6 голосов
/ 24 марта 2011

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

SelectedText = e.KeyChar.ToString(); 

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

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

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

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

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

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

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 голос
/ 24 марта 2011

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

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

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

0 голосов
/ 28 июля 2015

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

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

...