【发布时间】:2011-05-13 00:32:21
【问题描述】:
我为 RichTextBox 创建了自己的撤消系统,每当您执行某项操作时,都会将撤消操作添加到堆栈中,当您按下撤消时,此操作将被撤消。
这种行为与我实现它的所有控件都完美配合,除了 RichTextBoxes。我已将系统简化为最简单的元素,每当您按下删除时,它会将当前选定的文本及其索引添加到堆栈中,当您撤消此操作时,它将文本放回此索引。
这是去掉了最简单元素的代码(如文本文件的实际读取):
// Struct I use to store undo data
public struct UndoSection
{
public string Undo;
public int Index;
public UndoSection(int index, string undo)
{
Index = index;
Undo = undo;
}
}
public partial class Form1 : Form
{
// Stack for holding Undo Data
Stack<UndoSection> UndoStack = new Stack<UndoSection>();
// If delete is pressed, add a new UndoSection, if ctrl+z is pressed, peform undo.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
UndoStack.Push(new UndoSection(textBox1.SelectionStart, textBox1.SelectedText));
else if (e.Control && e.KeyCode == Keys.Z)
{
e.Handled = true;
UndoMenuItem_Click(textBox1, new EventArgs());
}
}
// Perform undo by setting selected text at stored index.
private void UndoMenuItem_Click(object sender, EventArgs e)
{
if (UndoStack.Count > 0)
{
// Save last selection for user
int LastStart = textBox1.SelectionStart;
int LastLength = textBox1.SelectionLength;
UndoSection Undo = UndoStack.Pop();
textBox1.Select(Undo.Index, 0);
textBox1.SelectedText = Undo.Undo;
textBox1.Select(LastStart, LastLength);
}
}
}
但是,如果您只选择一行中的 \n,而下面的更多文本如下:,然后按删除,然后撤消,似乎会撤消此 \n 字符两次。
【问题讨论】:
-
您是否已单步执行代码?可能是在某处输出堆栈中的所有内容,然后重新填充堆栈?
标签: c# winforms c#-4.0 richtextbox undo