我有一个RichTextBox,其中包含特殊文本位的自定义格式。但是有一个错误,插入一个字符后,插入符号放在新插入的字符之前而不是之后。
这是因为对于每次编辑,代码都会重新计算内容以应用自定义格式,然后像这样设置CaretPosition ......
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
currentPos = CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
// Apply special formatting on the content
Content = GetContentValue();
if (currentPos != null)
CaretPosition = currentPos;
}
我不确定如何在代码中移动插入符号以使其在插入的字符后出现,例如,如果原始内容为“11”并且我在文本的中间插入“2”,我希望插入符号在“2”之后。
目前显示为“1x21”(其中x是Caret)。任何帮助将不胜感激
答案 0 :(得分:2)
TextPointer对象指示的位置和LogicalDirection 是不可改变的。编辑或修改内容时,位置 由TextPointer指示不会相对于周围环境发生变化 文本;而是从内容的开头偏移该位置 相应调整以反映新的相对位置 内容。例如,TextPointer指示位置 一段给定段落的开头继续指向开头 即使在或之前插入或删除内容,该段落也是如此 在段落之后。 MSDN
以下代码在Button.Click
上插入文字。
private void Button_Click(object sender, RoutedEventArgs e)
{
/* text to insert */
string text = "some text";
/* get start pointer */
TextPointer startPtr = Rtb.Document.ContentStart;
/* get current caret position */
int start = startPtr.GetOffsetToPosition(Rtb.CaretPosition);
/* insert text */
Rtb.CaretPosition.InsertTextInRun(text);
/* update caret position */
Rtb.CaretPosition = startPtr.GetPositionAtOffset((start) + text.Length);
/* update focus */
Rtb.Focus();
}