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

Trying to reset the cursor position in a WPF Rich Text Box control

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

我认为问题在于它使用了绑定到 RichTextBox 的 TextPointer,并且在我清除原始文本时被重置,以便在重新应用它时位置发生变化。我实际上想做的是将其重置为原始文本中的字符位置索引,或者我很乐意处理 Lined 和 Columns。

我在互联网上搜索了应该是一个非常简单的问题的答案,但似乎没有任何答案。我真正想要的是 X/Y 坐标或任何有帮助的东西。

您可以使用 GetOffsetToPosition()GetPositionAtOffset() 来保存和恢复插入符号的相对位置。

换句话说,假设 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;
    }

注意 class 中的三个私有字段。

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

    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);
    }

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