如何在RichTextBox中以编程方式移动插入位置?

时间:2016-10-10 17:46:51

标签: wpf wpf-controls richtextbox

我有一个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)。任何帮助将不胜感激

1 个答案:

答案 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();
    }