在我的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);
答案 0 :(得分:12)
此代码改编自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);
}
答案 1 :(得分: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;
}