Как я могу получить начальный и конечный индекс из выбора внутри RichTextBox? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть расширенное текстовое поле, которое я позволяю пользователю выделять текст. Загружаемый текст поступает из простого простого текстового файла. Но мне нужно сохранить абсолютную начальную и конечную позиции символов (относительно начала документа) выделенного текста, чтобы при сохранении его можно было перезагрузить с выделением.

Пока я могу сделать это, чтобы применить подсветку

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

    }

Но я не вижу где-нибудь внутри объектов «Начало» или «Конец выделения» ничего, что обеспечивало бы положение символа? Почти все методы возвращают другой TextPointer - но как получить позицию символа из TextPointer?

При условии, что весь текст загружен в один

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

EDIT:

В непосредственном окне при отладке я могу получить доступ к чему-то, называемому CharOffset и Offset, но не могу сделать это в исходном коде, это дает ошибку компиляции. Также эти свойства хотя и присутствуют при проверке объекта во время выполнения, но их нет в документации.

enter image description here

И все же ...

enter image description here

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете найти индекс начала и конца выбора с помощью этого ...

        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...