首页 > 解决方案 > 如何在 Word 应用程序中将突出显示 ColorIndex 属性重置为不突出显示

问题描述

我在带有书签的 word 文档的标题中添加文本。

然后突出显示书签的文本。

但是,如果在那之后我输入或输入一些其他文本也会得到突出显示。

我的代码是:

Word.Document currDocument = WordApp.ActiveDocument;
Word.Selection currentSelection = WordApp.Selection;
if(currentSelection.HeaderFooter.IsHeader)
{
    Word.Range selectionRange = currentSelection.Range;

    selectionRange.Text ="abc";

    currentDocument.Bookmarks.Add("bookmark", selectionRange);
    currentDocument.Bookmarks[bookmarkName].Select();

    WordApp.Selection.Range.HighlightColorIndex = WdColorIndex.wdBrightGreen;

    **//from here I want to set highlight as off**
} 

我想只突出书签部分,而不是在那之后。

标签: c#ms-word

解决方案


使用Selection对象总是很棘手,如果可能的话应该避免。有时它会有所帮助,但在大多数情况下,使用Range对象更可靠。Selection几乎反映了用户必须如何工作。如果作为用户,您键入内容、选择它、应用突出显示,然后再键入一些内容,您就会看到所描述的行为。作为用户,您需要选择您输入的内容并删除突出显示 - 即使它只有一两个字符。从那时起,突出显示就消失了。无论是作为用户还是试图在代码中模仿它,这都是痛苦的。

考虑问题中代码的以下变体。插入书签后,使用该属性将第二个Range对象设置为原始对象。(很重要,否则这两个对象将是相同的 - 改变一个也会改变另一个。)RangeDuplicateDuplicateRange

这第二个Range对象被移动到原始位置之外的位置Range。现在可以对两者进行不同的处理。不像一个Selection代码可以与许多Ranges.

Word.Document currDocument = WordApp.ActiveDocument;
Word.Selection currentSelection = WordApp.Selection;
if(currentSelection.HeaderFooter.IsHeader)
{
  Word.Range selectionRange = currentSelection.Range;
  selectionRange.Text ="abc";
  currentDocument.Bookmarks.Add("bookmark", selectionRange);
  //currentDocument.Bookmarks[bookmarkName].Select();
  Word.Range rngAfterBookmark = selectionRange.Duplicate;
  //go to the end of the bookmarked range
  rngAfterBookmark.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
  //make sure the two ranges are no longer adjacent
  rngAfterBookmark.Text = " ";
  rngAfterBookmark.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
  selectionRange.HighlightColorIndex = WdColorIndex.wdBrightGreen;
} 

注意:通常我什至不会使用Selection页眉或页脚,而是使用页眉或页脚的Range. 我没有改变这一点,因为直到此时我才知道代码的逻辑。


推荐阅读