尝试重置WPF RTF文本框控件中的光标位置

时间:2017-03-03 09:19:27

标签: wpf position richtextbox caret

我有一个WPF富文本框控件,我用相同长度的新文本替换文本,我只想在替换文本之前获取原始插入位置,替换文本然后重置插入位置。

我认为问题在于它使用了与RichTextBox绑定的TextPointer,并在清除原始文本时重置,以便在重新应用它时,位置已更改。我真正想要做的是将其重置为原始文本中的字符位置索引,或者我很乐意处理Lined和Columns。

我已经在互联网上搜索了一个应该是一个非常简单的问题的答案,似乎没有什么可以回答它。我真正想要的是X / Y坐标或任何有用的东西。

1 个答案:

答案 0 :(得分:0)

您可以使用GetOffsetToPosition()GetPositionAtOffset()来保存Caret的相对位置并将其恢复。

换句话说,假设RichTextBox初始化如下:

    RichTextBox rtb;
    int paragraphIndex = -1;
    int indexInParagraph;

    public MainWindow()
    {
        InitializeComponent();

        rtb = new RichTextBox();
        rtb.Document = new FlowDocument();
        Paragraph para = new Paragraph(new Run("some text some text some text."));
        rtb.Document.Blocks.Add(para);
        // sets the caret at a specific (random) position in the paragraph:
        rtb.CaretPosition = para.ContentStart.GetPositionAtOffset(5);
        this.Content = rtb;
    }

请注意班级中的三个私有字段。

在替换文本之前,您应该在段落中保存插入符号的段落索引和插入符索引:

    public void SaveCaretState()
    {
        //enumerate and get the paragraph index
        paragraphIndex = -1;
        foreach (var p in rtb.Document.Blocks)
        {
            paragraphIndex++;
            if (p == rtb.CaretPosition.Paragraph)
                break;
        }
        //get index relative to the start of the paragraph:
        indexInParagraph = rtb.CaretPosition.Paragraph.ElementStart.GetOffsetToPosition(rtb.CaretPosition);
    }

并随时恢复:

    public void RestoreCaretState(MouseEventArgs e)
    {
        // you might need to insure some conditions here (paragraph should exist and ...)
        Paragraph para = rtb.Document.Blocks.ElementAt(paragraphIndex) as Paragraph;
        rtb.CaretPosition = para.ElementStart.GetPositionAtOffset(indexInParagraph);
    }

请注意,这是一个简单示例,Block中可能还有其他RichTextBox.Document个。但是,这个想法和实现并没有太大的不同。