How to Undo and Redo in C# (Rich Text Box)

前端 未结 2 933
囚心锁ツ
囚心锁ツ 2021-01-19 16:43

I\'ve been trying to get undo and redo working in my text editor for about 3 days now. It\'s doing my head in.

I have a text box (n

相关标签:
2条回答
  • 2021-01-19 16:54

    You can have the RichTextBox build the undo stack for you word by word, plus keep track of the caret position, by handling one of the KeyDown-, KeyPress- or KeyUp events like this:

     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
        }
    

    Since the RichTextBox does the job for you, you just have to call rtb.Undo() or rtb.Redo() from wherever you need to.

    0 讨论(0)
  • 2021-01-19 17:21

    Ok, I'll post some code to help you get started. first you need to listen for the TextChanged event.

    textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    

    and you need to declare a stack in the class

     Stack<string> undoList = new Stack<string>();
    

    In the text changed handler, you need to add the contents of the textbox to the stack

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

    Then you need to handle the undo, so you could simply use 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();
             }
        }
    
    0 讨论(0)
提交回复
热议问题