【问题标题】:How to find a TextRange in RichTextBox (between two TextPointers)如何在 RichTextBox 中查找 TextRange(两个 TextPointers 之间)
【发布时间】:2013-02-19 16:51:38
【问题描述】:

在我的 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);

【问题讨论】:

    标签: c# wpf richtextbox


    【解决方案1】:

    这段代码改编自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);
    }
    

    【讨论】:

    • TextPointer.GetPositionAtOffset 的偏移量是“符号”而不是字符,因此此代码通常不起作用。最有可能的情况是字符串单词包含空格或者是单词可以跨越 UIElements 的非英语语言。
    【解决方案2】:

    我认为,它也应该有效。

    这就像“查找下一个”列表中的任何项目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多