Найти и заменить в функции VSTO C #, не имеет никаких условий для того, чтобы сделать замененный текст жирным - PullRequest
0 голосов
/ 21 декабря 2018

Для поиска и замены жирным текстом я пытаюсь преобразовать свою подпрограмму VBA в функцию VSTO C #.

Простой перевод с VB на C # ничего не заменяет (вероятно, потому что текст поиска и текст замены)должны быть переданы как параметры в вызов Execute и не выбираются из параметров «oPara.Range.Find». Модификация для предоставления именованных параметров заменяет текст, но, похоже, не имеет способа сделать замененный текст«Жирный». Что особенного делает VB? Как этого добиться в C #? Настройка параметров «oPara.Range.Find» кажется бесполезной для C #

. Я уже пробовалкод ниже. Второй вызов Execute в C #, работает, но тогда я не могу сделать замененный текст BOLD .

Sub ReplaceWithBoldInVBA()
    Dim oPara As Object
    Set oPara = Selection.Paragraphs(1)
    oPara.Range.Select

    Dim bFound As Boolean
    With oPara.Range.Find
        .ClearFormatting
        .Text = "Test- "
        .Replacement.Text = "Test: "
        .Replacement.ClearFormatting
        .Replacement.Font.Bold = True
        .Replacement.Font.Italic = False
        .Replacement.Font.Underline = False
        .Forward = True
        .Wrap = wdFindStop
        .Format = True
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        bFound = .Execute(Replace:=wdReplaceOne)
    End With
End Sub

// Following is the VSTO Add-In C# code 
using Word = Microsoft.Office.Interop.Word;
public void ReplaceWithBoldIn_VSTO_AddIn_CSharp() {
    Word.Paragraph oPara = Globals.ThisAddIn.Application.Selection.Paragraphs[1];
    oPara.Range.Select();

    oPara.Range.Find.ClearFormatting();
    oPara.Range.Find.Text = "Test- ";
    oPara.Range.Find.Replacement.Text = "Test: ";
    oPara.Range.Find.Replacement.ClearFormatting();
    oPara.Range.Find.Replacement.Font.Bold = -1;
    oPara.Range.Find.Replacement.Font.Italic = 0;
    oPara.Range.Find.Replacement.Font.Underline = 0;
    oPara.Range.Find.Forward = true;
    oPara.Range.Find.Wrap = Word.WdFindWrap.wdFindStop;
    oPara.Range.Find.Format = true;
    oPara.Range.Find.MatchCase = true;
    oPara.Range.Find.MatchWholeWord = false;
    oPara.Range.Find.MatchWildcards = false;
    oPara.Range.Find.MatchSoundsLike = false;
    oPara.Range.Find.MatchAllWordForms = false;

    oPara.Range.Find.Execute(Replace: Word.WdReplace.wdReplaceOne);

    // The following Execute call works but then I can not make the replaced text **BOLD**.


    oPara.Range.Find.Execute(FindText: "Test- ", ReplaceWith: "Test: ", Replace: Word.WdReplace.wdReplaceOne)   
}

1 Ответ

0 голосов
/ 21 декабря 2018

Причина, по которой у C # возникают трудности, заключается в том, что точное Range для применения Find.Execute недостаточно ясно.VBA может сделать это из-за With - эта связь отсутствует в коде C #.

Следующее работает для меня.Обратите внимание, как определенные объекты Range и Find объявляются и используются для назначения свойств Find, а тот же объект используется для Execute.(Примечание: декларация и создание экземпляра rngFind на самом деле не были бы необходимыми в наши дни. В первые дни существования C # за пределами VSTO его использование было теперь вопросом личных предпочтений.)

        Word.Paragraph oPara = Globals.ThisAddIn.Application.Selection.Paragraphs[1];
        Word.Range rngFind = oPara.Range;
        Word.Find fnd = rngFind.Find;
        fnd.ClearFormatting();
        fnd.Text = "Test- ";
        fnd.Replacement.Text = "Test: ";
        fnd.Replacement.ClearFormatting();
        fnd.Replacement.Font.Bold = -1;
        fnd.Replacement.Font.Italic = 0;
        fnd.Replacement.Font.Underline = 0;
        fnd.Forward = true;
        fnd.Wrap = Word.WdFindWrap.wdFindStop;
        fnd.Format = true;
        fnd.MatchCase = true;
        fnd.MatchWholeWord = false;
        fnd.MatchWildcards = false;
        fnd.MatchSoundsLike = false;
        fnd.MatchAllWordForms = false;

        fnd.Execute(Replace: Word.WdReplace.wdReplaceOne);
...