C# VSTO:计算所有范围。查找结果

C# VSTO:计算所有范围。查找结果,c#,ms-word,vsto,C#,Ms Word,Vsto,我使用该方法标记特定单词的所有出现处。 此外,我想向用户显示这些单词,或者滚动到它们,甚至只是计算找到了多少单词 我目前正在使用此代码: Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Range(); range.Find.HitHighlight( FindText: "dog", MatchCase: false, MatchWholeWord: true, HighlightCo

我使用该方法标记特定单词的所有出现处。 此外,我想向用户显示这些单词,或者滚动到它们,甚至只是计算找到了多少单词

我目前正在使用此代码:

Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Range();
range.Find.HitHighlight(
     FindText: "dog",
     MatchCase: false, MatchWholeWord: true,
     HighlightColor: item.color);
问题是,是否有方法使用该方法或使用其他方法返回我提到的请求之一,或者除了使用以下代码之外别无选择:

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

(我不喜欢使用此代码,因为我相信有一种方法可以使用MSWord的工具,而不是自己获取所有文本)

在Word对象模型中,没有任何东西可以返回使用
HitHighlight
找到的所有“点击”。通常,它不是根据任何特定属性来返回非连续范围集合的

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

对于任何其他操作,您都需要执行常规的
查找。在循环中执行
,将每个找到的
范围添加到数组中(或任何内容)。例如,这将允许您向用户显示包含周围文本的列表

成功查找时使用
Range.Find
(与
Document.Content.Find
)相反,
Range
对象包含找到的文本。这样做的诀窍是,在成功查找后,必须重置范围才能继续。类似这样的内容(从内存键入,因此可能是语法错误):


嗯,实际上Word在最近的版本中已经内置了这个工具。按Ctrl+F以获取“查找”窗格。在顶部输入你想搜索的词,Word将显示整个列表-从列表中选择感兴趣的词…是的,我当然知道!我只是需要用编程的方式来做这件事。好吧-不是所有来自C方的人都知道这些事情:-)只是想确定你真的想“重新发明轮子”!
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;
  }
}