如何从RichTextBox中的选择中获取开始和结束索引?

时间:2018-05-02 22:16:43

标签: c# wpf

我有一个富文本框,我允许用户突出显示文本。正在加载的文本来自简单的纯文本文件。但是我需要存储突出显示文本的绝对开始和结束字符位置(相对于文档的开头),这样当它们保存时,它可以重新加载高亮显示。

到目前为止,我可以执行此操作以应用突出显示

    private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        HighlightWordInTextBox(this.textBox, this.textBox.Selection.ToString(), new SolidColorBrush(Colors.Yellow));
    }

    public void HighlightWordInTextBox(RichTextBox textbox, string word, SolidColorBrush color)
    {
        TextRange tr = new TextRange(this.textBox.Selection.Start, this.textBox.Selection.End);
        tr.ApplyPropertyValue(TextElement.BackgroundProperty, color);

    }

但是我没有在选择的Start或End对象中看到任何提供角色位置的东西?几乎所有方法都返回另一个TextPointer - 但是如何从TextPointer中获取字符位置?

假设所有文本都加载到单个

   this.textBox.Document.Blocks.Add(new Paragraph(new Run(fullText)));

修改

在调试的即时窗口中,我可以访问名为CharOffset和Offset的东西,但在源代码中不能这样做,它会产生编译错误。此外,这些属性虽然在运行时检查对象时存在,但它们不在文档中。

enter image description here

然而......

enter image description here

1 个答案:

答案 0 :(得分:2)

你可以找到选择的开始和结束的索引......

        var docStart = textBox.Document.ContentStart;

        var selectionStart = textBox.Selection.Start;
        var selectionEnd = textBox.Selection.End;

        //these will give you the positions needed to apply highlighting
        var indexStart = docStart.GetOffsetToPosition(selectionStart);
        var indexEnd = docStart.GetOffsetToPosition(selectionEnd);

        //these values will give you the absolute character positions relative to the very beginning of the text.
        TextRange start = new TextRange(docStart, selectionStart);
        TextRange end = new TextRange(docStart, selectionEnd);
        int indexStart_abs = start.Text.Length;
        int indexEnd_abs = end.Text.Length;