.NET RichTextBox文本更改代码未记录撤消

时间:2018-02-14 19:24:44

标签: c# .net winforms richtextbox

我在文本编辑器中使用RichTextBox控件。我也有撤销功能。

当我更改RichTextBox内的文字并按下撤消(RichTextBox.Undo();)时,eveything就可以了,它可以完成预期的工作。
但是当我使用RichTextBox.Text = "somestring"从代码更改文本时,它不会记录撤消的文本 有没有办法实现这一点,最好不要自己跟踪任何变化?

2 个答案:

答案 0 :(得分:0)

如果你想完全从代码中排除操作,我认为很难实现。在您的示例代码中,如果我们将字符串文本粘贴到RichTextBox上,那么我们执行“Ctrl + Z”或撤消操作,您想要什么效果?所有的文字都消失了?因为如果没有这里的代码操作,如果我们只是将一些字符串文本粘贴到普通的RichTextBox上,则撤消操作将通过撤消粘贴操作来清除文本。如果你想要相同的效果,我想你可以使用下面的代码,或者你想在这种情况下想要一些其他的效果,请更清楚地表达你的关注,我们仍然会尽力帮助。

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e)

    {

        if (e.Control && (e.KeyCode == Keys.Z))

        {

            while (this.richTextBox1.CanUndo &&

                this.richTextBox1.UndoActionName.Equals("Unknown"))

            {

                this.richTextBox1.Undo();

            }

        }

        else if (e.Control && (e.KeyCode == Keys.V))

        {

            HighLightText();

            e.Handled = true;

        }

        else if (e.Shift && (e.KeyCode == Keys.Insert))

        {

            HighLightText();

            e.Handled = true;

        }  

    }



    private void HighLightText()

    {

        int iCount = 0;

        int iWordPos = 0;

        DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Text);

        this.richTextBox1.Paste(myFormat);

        string[] strSplitText = this.richTextBox1.Text.Split(' ');

        foreach (string strWord in strSplitText)

        {

            if (iCount % 2 == 0)

            {

                this.richTextBox1.Select(iWordPos, strWord.Length);

                this.richTextBox1.SelectionColor = Color.Blue;

            }

            else

            {

                this.richTextBox1.Select(iWordPos, strWord.Length);

                this.richTextBox1.SelectionColor = Color.Black;

            }

            iWordPos += strWord.Length + 1;

            iCount++;

        }

        this.richTextBox1.Select(this.richTextBox1.Text.Length - 1, 0);

    }

答案 1 :(得分:0)

如果您使用SelectedText属性,则会注册更改以进行撤消。

所以而不是:

RichTextBox.Text = "somestring"

使用

    RichTextBox.SelectAll();
    RichTextBox.SelectedText = "something";