我在文本编辑器中使用RichTextBox
控件。我也有撤销功能。
当我更改RichTextBox
内的文字并按下撤消(RichTextBox.Undo();
)时,eveything就可以了,它可以完成预期的工作。
但是当我使用RichTextBox.Text = "somestring"
从代码更改文本时,它不会记录撤消的文本
有没有办法实现这一点,最好不要自己跟踪任何变化?
答案 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";