VSTO:计算所有 Range.Find 个结果

VSTO: Count all Range.Find results

我使用 Find.HitHighlight 方法来标记所有出现的特定单词。 此外,我想向用户显示单词,或滚动到它们,甚至只是计算找到的单词数。

我目前正在使用此代码:

Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Range();
range.Find.HitHighlight(
     FindText: "dog",
     MatchCase: false, MatchWholeWord: true,
     HighlightColor: item.color);

问题是,有没有办法取回我提到的其中一个请求,使用 Find.HitHighlight 方法,或者使用其他方法,或者别无选择,只能使用以下代码:

var text = range.Text.Split(' ');
text.Count(word => word.Equals("dog"));

(我不想使用这段代码,因为我相信有一种方法可以使用 MSWord 的工具而不是自己拿走所有的文本)

Word 对象模型中没有任何东西可以 return 使用 HitHighlight 找到的所有 "hits"。它根本不是为 return 不连续的范围集合而设计的,一般来说,根据任何特定的属性。

如果您只想计数,您已有的 C# 代码可能是执行速度最快的。您会丢失任何格式和位置信息,但这些信息并不重要。

对于其他任何事情,您需要在循环中执行常规 Find.Execute,将找到的每个 Range 添加到数组(或其他)。例如,这将允许您向用户显示带有周围文本的列表。

当您使用 Range.Find(相对于 Document.Content.Find)成功查找时,Range 对象包含找到的文本。类似这样的技巧是,在成功查找后,必须重置范围才能继续。像这样的东西(凭记忆输入,所以可能有语法错误):

Word.Range rngDoc = wrdDocument.Content;
Word.Range rngFind = rngDoc.Duplicate;
bool bFound = true;
object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
while (bFound)
{
  bFound = rngFind.Find.Execute(/*params here*/);
  if (bFound)
  {
     //Do something with rngFind
     //Set the start of the Range to search AFTER what was found
     rngFind.Collapse(ref oCollapseEnd);
     //and extend it to the end of the original Range
     // in this case the entire document
     rngFind.End = rngDoc.End;
  }
}