【问题标题】:When I redo using this undo/redo code, the first thing undone cannot be redone当我使用此撤消/重做代码重做时,第一件事撤消不能重做
【发布时间】:2023-10-14 16:09:01
【问题描述】:

我正在使用以下代码在我的应用程序中实现撤消/重做:

    public struct UndoSection
    {
        public string Undo;
        public int Index;   
}

--

 public UndoSection(int index, string undo)
    {
        Index = index;
        Undo = undo;
    }

--

            Stack<UndoSection> UndoStack = new Stack<UndoSection>();
 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
                UndoStack.Push(new UndoSection(richTextBoxPrintCtrl1.SelectionStart, richTextBoxPrintCtrl1.SelectedText));
            else if (e.Control && e.KeyCode == Keys.Z)
            {
                e.Handled = true;
                undo_Click(richTextBoxPrintCtrl1, new EventArgs());
            }
        }

     public string[] RTBRedoUndo;
        public int StackCount = 0;
        public int OldLength = 0;
        public int ChangeToSave = 5;
        public bool IsRedoUndo = false;

--

    public void RTBTextChanged()
    {
        if (richTextBoxPrintCtrl1.TextLength - OldLength >= ChangeToSave | richTextBoxPrintCtrl1.TextLength - OldLength <= ChangeToSave)
        {
            StackCount += 1;
            RTBRedoUndo[StackCount] = richTextBoxPrintCtrl1.Text;
        }
    }

    public void UndoCode()
    {
        IsRedoUndo = true;
        if (StackCount > 0 && RTBRedoUndo[StackCount - 1] != null)
        {
            StackCount = StackCount - 1;
            richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount];
        }
    }

    public void RedoCode()
    {
        if (IsRedoUndo == false && richTextBoxPrintCtrl1.Text.Substring(richTextBoxPrintCtrl1.Text.Length - 1, 1) == " ")

            IsRedoUndo = true;
        if (StackCount > 0 && RTBRedoUndo[StackCount + 1] != null)
        {
            StackCount = StackCount + 1;
            richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount];
        }

但是,如果我在富文本框中键入一些文本,例如:“你好。这是我的应用程序。”,它只会让我重做“我的”。它不会让我重做“应用程序”。如果我撤消所有文本,我就无法重做和恢复文本。

是什么导致它以这种方式运行?我真的需要让这个撤消/重做代码正常工作。有人可以帮我指出正确的方向吗?

--编辑--

重做代码:

public void RedoCode()
    {
        if (IsRedoUndo == false && richTextBoxPrintCtrl1.Text.Substring(richTextBoxPrintCtrl1.Text.Length - 1, 1) == " ")

            IsRedoUndo = true;
        if (StackCount > 0 && RTBRedoUndo[StackCount + 1] != null)
        {
            StackCount = StackCount + 1;
            richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount];
        }

    }

通过按钮点击调用,使用RedoCode();

【问题讨论】:

    标签: c# visual-studio .net-4.0 richtextbox undo-redo


    【解决方案1】:

    你能说明如何调用重做函数吗?

    据我所知,您错过了以下代码

     private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
                    UndoStack.Push(new UndoSection(richTextBoxPrintCtrl1.SelectionStart, richTextBoxPrintCtrl1.SelectedText));
                else if (e.Control && e.KeyCode == Keys.Z)
                {
                    e.Handled = true;
                    undo_Click(richTextBoxPrintCtrl1, new EventArgs());
                }
                else if (e.Control && e.KeyCode == Keys.Y)
                {
                    e.Handled = true;
                    redo_Click(richTextBoxPrintCtrl1, new EventArgs());
                }
    

    【讨论】:

    • 请参阅编辑。我已经添加了您的 KeyDown 代码,但似乎没有任何改变。
    最近更新 更多