3

System.Windows.Controls.RichTextBoxで、特定の単語のTextRangeを検索したいと思います。ただし、最初に見つかった単語の後に正しいPositionAtOffsetが表示されません。最初の単語は正しく、次に見つかった単語の位置は正しくありません。私は正しい方法を使用していますか?

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

2 に答える 2

13

MSDNのサンプルを基にしたこのコードは、指定された位置から単語を検索します。

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

その後、次のように使用できます。

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);
}
于 2009-06-12T03:27:39.813 に答える
0

私はそれもうまくいくはずだと思います。

これは、リストから任意のアイテムを「次を検索」するようなものです。

    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;
    }
于 2013-02-19T08:51:38.723 に答える