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

时间:2013-04-02 19:24:36

标签: c# winforms visual-studio-2012

我一直在努力让撤消重做在我的文本编辑器中工作大约3天。它正在努力。

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

因此,如果我点击撤消按钮,则取消最后一个单词。如果我点击重做按钮,则重做最后一个单词。

有人可以帮我搞定吗?

richTextBoxPrintCtrl1.Undo();效果不佳。它会删除文本框中输入的所有内容。

提前感谢您的帮助。

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

2 个答案:

答案 0 :(得分:7)

好的,我会发布一些代码来帮助您入门。首先,您需要倾听TextChanged事件。

textBox1.TextChanged += new EventHandler(textBox1_TextChanged);

你需要在类

中声明一个堆栈
 Stack<string> undoList = new Stack<string>();

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

 void textBox1_TextChanged(object sender, EventArgs e)
    {
        undoList.Push(textBox1.Text);
    }

然后你需要处理撤消,所以你可以简单地使用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();
         }
    }

答案 1 :(得分:2)

您可以让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
    }

由于RichTextBox为您完成了这项工作,您只需从您需要的任何地方拨打rtb.Undo()rtb.Redo()即可。