C# 自定义RichTextBox的撤消重做

C# 自定义RichTextBox的撤消重做,c#,wpf,xaml,c#-4.0,richtextbox,C#,Wpf,Xaml,C# 4.0,Richtextbox,是否有一种方法可以设置Richtextbox,使其不会在其撤消堆栈中合并文本撤消单元。默认行为是,当您写入文本(全部在同一段落中)时,您键入的整个文本属于同一撤消单元。我想要的是每个单词有一个撤销单元。 我试过了,但没用 -->在键入文本之前: myRichTextBox.BeginChange(); -->您刚刚键入了一个空格: myRichTextBox.EndChange(); myRichTextBox.LockCurrentUndoUnit(); myRichTextBox.Begi

是否有一种方法可以设置Richtextbox,使其不会在其撤消堆栈中合并文本撤消单元。默认行为是,当您写入文本(全部在同一段落中)时,您键入的整个文本属于同一撤消单元。我想要的是每个单词有一个撤销单元。 我试过了,但没用

-->在键入文本之前:

myRichTextBox.BeginChange();
-->您刚刚键入了一个空格:

myRichTextBox.EndChange();
myRichTextBox.LockCurrentUndoUnit();
myRichTextBox.BeginChange();
但当我运行应用程序时,在键入一些文本后,撤消命令(ctrl+z)的行为仍然相同

重写RichTextBox的OnPreviewKeyDown(KeyEventArgs e)方法,然后添加如下内容:

if (e.Key==Key.Space)
{
   BeginChange();
   //set logical direction to be backward
   CaretPosition = CaretPosition.GetPositionAtOffset(0, LogicalDirection.Backward);
   CaretPosition.InsertTextInRun(" "); // Insert space
   CaretPosition = CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
   e.Handled = true;
   EndChange();
}
您可以插入其他字符,如“{”、“}”、。。。有相同的行为

这对我很有用。

重写RichTextBox的OnPreviewKeyDown(KeyEventArgs e)方法,然后添加如下内容:

if (e.Key==Key.Space)
{
   BeginChange();
   //set logical direction to be backward
   CaretPosition = CaretPosition.GetPositionAtOffset(0, LogicalDirection.Backward);
   CaretPosition.InsertTextInRun(" "); // Insert space
   CaretPosition = CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
   e.Handled = true;
   EndChange();
}
您可以插入其他字符,如“{”、“}”、。。。有相同的行为

这对我有用