Как определить, содержит ли абзац MS-Word более одной строки? - PullRequest
0 голосов
/ 21 марта 2020

То, что я хочу, это не найти, где ввод был нажат в абзаце (конец абзаца). Мне нужно определить, содержит ли абзац одну строку или несколько строк, чтобы его можно было соответствующим образом отформатировать (центрировать или выровнять по левому краю).

Как в центре, если он в одной строке

enter image description here

или выравнивание по левому краю, если в Multiline

enter image description here

Как определить, является ли абзац более одной строки во ВСТО?

1 Ответ

1 голос
/ 21 марта 2020

Поскольку "линии" не являются объектами в объектной модели Word, из-за ее динамических алгоритмов компоновки c, к этому нужно подходить с помощью старой технологии WordBasi c, все еще встроенной в API. (WordBasi c работал на основе выборок, а не объектов, поэтому эта возможность присутствует в этих старых методах.)

В этом случае перечисление Word.WdInformation предлагает параметры, которые работают с «строками» более конкретно для этой проблемы wdFirstCharacterLineNumber.

В следующем примере кода содержится фрагмент кода, который вызывает IsParaOneLine для указанного c абзаца документа.

IsParaOneLIne дублирует абзац Range пропустил два его дважды : один раз для начальной точки и один раз для конечной точки. Эти диапазоны затем свернуты до их начальной и конечной точек, соответственно, и определен номер строки. Если они совпадают, true возвращается к вызывающему коду, в противном случае false.

Примечания:

  1. rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1); перемещает конечную точку назад на один символ, потому что после свертывания до конца абзаца Range, Range находится в начале следующего абзаца. Это возвращает его к исходному абзацу.

  2. В примере применяется стиль, а не «прямое форматирование». Вместо форматирования с выравниванием по центру и левому краю документа настоятельно рекомендуется использовать Styles . Если нет встроенного стиля с требуемым форматированием, создайте нужные стили. Если вы знакомы с CSS, вы знаете преимущества использования стилей. У Word есть еще одна причина: он значительно сокращает временные файлы, которые генерирует Word, так что у вас меньше шансов исчерпать память.

         Word.Range rng = doc.Paragraphs[2].Range;
    
        if (IsParaOneLine(rng))
        {
            rng.set_Style(Word.WdBuiltinStyle.wdStyleHeading1);
        }
        else
        {
            Debug.Print("Not one line");
        }
    
    
    public bool IsParaOneLine(Word.Range rng)
    {
        Word.Range rngStart = rng.Duplicate;
        rngStart.Collapse(Word.WdCollapseDirection.wdCollapseStart);
        Word.Range rngEnd = rng.Duplicate;
        rngEnd.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
        rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1);
        int posLineStart = (int) rngStart.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);
        int posLineEnd = (int) rngEnd.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);
        bool isSameLine = false;
    
        if (posLineStart == posLineEnd)
            isSameLine = true;
    
        return isSameLine;
    }
    
...