2009-06-11 9 views
2

Dans mon System.Windows.Controls.RichTextBox, je voudrais trouver un TextRange d'un mot donné. Cependant, il ne me donne pas le PositionAtOffset correct après le premier mot trouvé. Le premier est correct, puis pour les prochains mots trouvés, la position n'est pas correcte. Est-ce que j'utilise les bonnes méthodes?Comment trouver un TextRange dans RichTextBox (entre deux TextPointers)

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

Répondre

11

Ce code adapté d'un échantillon à MSDN trouvera mots d'une position spécifiée.

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

Vous pouvez alors l'utiliser comme ceci:

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

Le décalage de TextPointer.GetPositionAtOffset est 'symboles' pas de caractères, donc ce code ne fonctionnera pas en général. Très probablement si le mot string contient des espaces ou est une langue non-anglaise où les mots peuvent s'étendre à UIElements. – Mark

0

Je pense, cela devrait fonctionner aussi.

C'est comme "trouver ensuite" n'importe quel élément de la liste.

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