5

大约 3 天以来,我一直在尝试在我的文本编辑器中撤消重做工作。它在我的脑海里。

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

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

有人可以帮我解决这个问题吗?

richTextBoxPrintCtrl1.Undo();不能很好地工作。它会删除在文本框中键入的所有内容。

在此先感谢您的帮助。

我知道这个问题之前已经被问过很多次了,但是我无法使用我在 SO 上浏览过的问题中的信息来解决这个问题。

4

2 回答 2

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();
         }
    }
于 2013-04-02T20:09:31.467 回答
4

您可以让 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()从任何您需要的地方拨打电话即可。

于 2014-10-07T14:23:37.267 回答