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. Документация в обзоре классов, гласящая "Устанавливает выделенный текст в указанный текст без очистки буфера отмены", кажется запутанной. Я только что попробовал это, и это устанавливает Отмену, как ожидалось.
Несмотря на свое название, он вообще не имеет отношения к буферу обмена, он просто заменяет выбранный в настоящее время текст текстом, который вы предоставляете в качестве аргумента, и, следовательно, кажется, просто выполняет то, о чем просит вопрос, очень простым способом.