winforms C#:无法撤消插入的文本

zphenhs4  于 2023-03-09  发布在  C#
关注(0)|答案(3)|浏览(185)

我正在使用KeyPress事件以编程方式在自定义RichTextBox中添加文本:

SelectedText = e.KeyChar.ToString();

问题是以这种方式插入文本不会触发CanUndo标志。
因此,当我尝试撤销/重做文本(通过调用textbox的Undo()和Redo()方法)时,什么也没发生。
我尝试通过编程方式从TextChanged()事件中调用KeyUp()事件,但仍然没有将CanUndo标记为true。
如何撤消插入的文本,而不必创建“撤消”和“重做”操作列表?
谢谢

vwoqyblh

vwoqyblh1#

我最终决定使用堆栈创建我自己的撤销-重做系统。
下面是我如何做到这一点的简要概述:

private const int InitialStackSize = 500;    
private Stack<String> undoStack = new Stack<String>(InitialStackSize);
private Stack<String> redoStack = new Stack<String>(InitialStackSize); 

private void YourKeyPressEventHandler(...)
{
        // The user pressed on CTRL - Z, execute an "Undo"
        if (e.KeyChar == 26)
        {
            // Save the cursor's position
            int selectionStartBackup = SelectionStart;

            redoStack.Push(Text);
            Text = undoStack.Pop();

            // Restore the cursor's position
            SelectionStart = selectionStartBackup;
        }
        // The user pressed on CTRL - Y, execute a "Redo"
        if (e.KeyChar == 25)
        {
            if (redoStack.Count <= 0)
                return;

            // Save the cursor's position
            int selectionStartBackup = SelectionStart + redoStack.ElementAt(redoStack.Count - 1).Length;

            undoStack.Push(Text);
            Text = redoStack.Pop();

            // Restore the cursor's position
            SelectionStart = selectionStartBackup;

            return;
        }    

        undoStack.Push(Text);
        SelectedText = e.KeyChar.ToString();  
}
o3imoua4

o3imoua42#

这只是一个想法,但如果您将插入符号的位置设置为要插入文本的位置,而不是修改Text属性,只是send the keys,会怎么样呢?

SendKeys.Send("The keys I want to send");

肯定会有怪癖,但正如我所说,这只是一个想法。

0vvn1miw

0vvn1miw3#

你可以使用TextBox.Pasteclass overview中的文档,说“将选定文本设置为指定文本而不清除撤销缓冲区。",看起来很混乱。我刚刚试过,它按预期设置撤销。
不管它的名字是什么,它与剪贴板没有任何关系,它只是用你作为参数提供的文本替换当前选择的文本,因此看起来只是以非常简单的方式做了问题要求的事情。

相关问题