如何在C#中撤消和重做(富文本框)

4 c# winforms visual-studio-2012

我一直试图在我的文本编辑器中进行撤消重做大约3天.它正在努力.

我有一个文本框(命名richTextBoxPrintCtrl1),我希望能够撤消和*重做*(逐字逐句).

因此,如果我单击撤消按钮,它将撤消最后一个单词.如果我然后单击重做按钮,它重做最后一个单词.

有人可以帮我搞定吗?

richTextBoxPrintCtrl1.Undo();效果不好.它删除文本框中键入的所有内容.

在此先感谢您的帮助.

我知道这个问题之前已被多次询问过,但是我无法使用我在这里浏览过的问题中的信息.

jug*_*1es 7

好的,我会发布一些代码来帮助你入门.首先你需要听取这个TextChanged事件.

textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
Run Code Online (Sandbox Code Playgroud)

你需要在类中声明一个堆栈

 Stack<string> undoList = new Stack<string>();
Run Code Online (Sandbox Code Playgroud)

在文本更改处理程序中,您需要将文本框的内容添加到堆栈中

 void textBox1_TextChanged(object sender, EventArgs e)
    {
        undoList.Push(textBox1.Text);
    }
Run Code Online (Sandbox Code Playgroud)

然后你需要处理撤消,所以你可以简单地使用CTRL-Z

 textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);

void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
         if(e.KeyCode == Keys.Z && (e.Control)) {
             textBox1.Text = undoList.Pop();
         }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以让 RichTextBox 逐字构建撤消堆栈,并通过处理 KeyDown-、KeyPress- 或 KeyUp 事件之一来跟踪插入符位置,如下所示:

 private void rtb_KeyDown(object sender, KeyEventArgs e)
    {
        // Trick to build undo stack word by word
        RichTextBox rtb = (RichTextBox)sender;
        if (e.KeyCode == Keys.Space)
        {
            this.SuspendLayout();
            rtb.Undo();
            rtb.Redo();
            this.ResumeLayout();
        }
        // eztnap
    }
Run Code Online (Sandbox Code Playgroud)

由于 RichTextBox 会为您完成这项工作,因此您只需从任何需要的地方调用rtb.Undo()或即可。rtb.Redo()