【问题标题】:.NET RichTextBox Text change from code not recording undo.NET RichTextBox 文本从代码更改不记录撤消
【发布时间】:2018-02-14 19:24:44
【问题描述】:
我在文本编辑器中使用RichTextBox 控件。我还有一个撤销功能。
当我更改 RichTextBox 中的文本并按撤消 (RichTextBox.Undo();) 时,一切都很好,它会按预期进行。
但是,当我使用 RichTextBox.Text = "somestring" 更改代码中的文本时,它不会记录用于撤消的内容。
有什么方法可以启用此功能,最好自己不跟踪任何更改? p>
【问题讨论】:
标签:
c#
.net
winforms
richtextbox
【解决方案1】:
如果你想从代码中完全排除操作,我认为很难实现。而在您的示例代码中,如果我们将字符串文本粘贴到 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);
}
【解决方案2】:
如果您使用SelectedText 属性,更改将被注册以进行撤消。
所以而不是:
RichTextBox.Text = "somestring"
使用
RichTextBox.SelectAll();
RichTextBox.SelectedText = "something";