How to find TextRange in RichTextBox (between two TextPointers)

In my System.Windows.Controls.RichTextBox, I would like to find the TextRange of the given word. However, this does not give me the correct PositionAtOffset after the first word found. The first is correct, and then the position is incorrect for the next words found. Am I using the right methods?

Loop through listOfWords

Word= listOfWords[j].ToString();

startPos = new TextRange(transcriberArea.Document.ContentStart, transcriberArea.Document.ContentEnd).Text.IndexOf(Word.Trim());

 leftPointer = textPointer.GetPositionAtOffset(startPos + 1, LogicalDirection.Forward);

rightPointer = textPointer.GetPositionAtOffset((startPos + 1 + Word.Length), LogicalDirection.Backward);
TextRange myRange= new TextRange(leftPointer, rightPointer);
+2
source share
2 answers

This code, adapted from a sample on MSDN , will find words from the specified position.

TextRange FindWordFromPosition(TextPointer position, string word)
{
    while (position != null)
    {
        if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
        {
            string textRun = position.GetTextInRun(LogicalDirection.Forward);

            // Find the starting index of any substring that matches "word".
            int indexInRun = textRun.IndexOf(word);
            if (indexInRun >= 0)
            {
                TextPointer start = position.GetPositionAtOffset(indexInRun);
                TextPointer end = start.GetPositionAtOffset(word.Length);
                return new TextRange(start, end);
            }
        }

        position = position.GetNextContextPosition(LogicalDirection.Forward);
    }

    // position will be null if "word" is not found.
    return null;
}

Then you can use it like this:

string[] listOfWords = new string[] { "Word", "Text", "Etc", };
for (int j = 0; j < listOfWords.Length; j++)
{
    string Word = listOfWords[j].ToString();
    TextRange myRange = FindWordFromPosition(x_RichBox.Document.ContentStart, Word);
}
+11
source

I think it should work too.

It is like “finding the next” any item from a list.

    TextPointer FindWordsFromPosition(TextPointer position, IList<string> words)
    {
        var firstPosition = position;
        while (position != null)
        {
            if (position.GetPointerContext(LogicalDirection.Forward) ==    TextPointerContext.Text)
            {
                string textRun = position.GetTextInRun(LogicalDirection.Forward);

                var indexesInRun = new List<int>();

                foreach (var word in words)
                {
                    var index = textRun.IndexOf(word);

                    if (index == 0)
                        index = textRun.IndexOf(word, 1);

                    indexesInRun.Add(index);
                }

                indexesInRun = indexesInRun.Where(i => i != 0 && i != -1).OrderBy(i => i).ToList();

                if (indexesInRun.Any())
                {
                    position = position.GetPositionAtOffset(indexesInRun.First());
                    break;
                }

                return firstPosition;
            }
            else
                position = position.GetNextContextPosition(LogicalDirection.Forward);
        }

        return position;
    }
0

Source: https://habr.com/ru/post/1716013/


All Articles