Как сбросить подсветку ColorIndex свойство без подсветки в приложении Word - PullRequest
0 голосов
/ 28 января 2019

Я добавляю текст в заголовок текстового документа с закладкой.

Затем выделяю текст закладки.

Но если после этого я введу или наберу какой-нибудь другой текст, который также получит подсветку.

Мой код:

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

Я хочувыделять только часть закладки не после этого.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Как правильно отмечает Синди, по возможности следует избегать работы с Selection.При этом вам нужно применить wdNoHighLight к непустому диапазону, чтобы эффект вступил в силу.Итак, начиная с вашей последней строки, следующий код делает это.Адаптируйтесь к своим потребностям так, как считаете нужным:

WordApp.Selection.Range.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen;
WordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
WordApp.Selection.MoveRight(Word.WdUnits.wdCharacter, 1, Extend: true);
WordApp.Selection.Range.HighlightColorIndex = Word.WdColorIndex.wdNoHighlight;
WordApp.Selection.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
WordApp.Selection.TypeText("YaddaYadda");

Вы должны увидеть «YaddaYadda» без выделения.

Немного дополнительно: двойные точки (точка-точка выбора) обычно вызывают проблемы, когдаработа с COM-объектами.Попробуйте вместо этого использовать замещающие переменные.Также убедитесь, что вы используете

Marshal.ReleaseComObject(document);

, а также освободите все остальные ссылки на Word до конца кода.

Редактировать: Альтернатива без выделения.Самый простой способ - просто использовать замену для невыделенного текста.Чтобы упростить задачу, я получил доступ к первичному заголовку первой страницы.

var section = currDocument.Sections.First;
var header = section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary];
var hRange = header.Range.FormattedText;
var highlightedText = "abc";
var normalText = " Yadda yadda";

//insert highlighted text and bookmark
hRange.Text = highlightedText;
currDocument.Bookmarks.Add("bookmark", hRange);
hRange.HighlightColorIndex = Word.WdColorIndex.wdBrightGreen;

//insert normal text, turn off highlighting
hRange.InsertAfter(normalText);
var find = hRange.Find;
find.ClearFormatting();
find.Replacement.ClearFormatting();
find.Text = normalText;
find.Replacement.Text = normalText;
find.Replacement.Highlight = (int) Word.WdColorIndex.wdNoHighlight;
find.Execute(Replace: Word.WdReplace.wdReplaceOne);

Marshal.ReleaseComObject(find);
Marshal.ReleaseComObject(hRange);
Marshal.ReleaseComObject(header);
Marshal.ReleaseComObject(section);
0 голосов
/ 28 января 2019

Работа с объектом Selection всегда сложна и ее следует избегать, если это возможно.Иногда это помогает, но в большинстве случаев работа с Range объектами более надежна.Selection в значительной степени отражает то, как пользователь должен работать.Если вы как пользователь набираете что-то, выбираете это, применяете выделение, а затем набираете еще несколько, и вы видите точно описанное поведение.Как пользователь, вам нужно будет выбрать то, что вы ввели, и убрать выделение - даже если это всего один или два символа.С этого момента подсветка исчезла.Это болезненно как для пользователя, так и для попытки имитировать его в коде.

Рассмотрим следующую вариацию кода в вопросе.После вставки закладки второй объект Range устанавливается в исходное значение Range с использованием свойства Duplicate.(Duplicate важно, потому что в противном случае два Range объекта были бы идентичны - изменение одного также изменило бы другой.)

Этот второй 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,Я не изменил это, потому что до этого момента я не знал логику кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...