Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定MS Word段落是否不止一行?_C#_Ms Word_Vsto - Fatal编程技术网

C# 如何确定MS Word段落是否不止一行?

C# 如何确定MS Word段落是否不止一行?,c#,ms-word,vsto,C#,Ms Word,Vsto,我不想找到在段落(段落末尾)中按enter键的位置。我需要确定段落是包含一行还是多行,以便可以相应地格式化(居中或左对齐) 如果它在一条直线上,就在中间 或左对齐(如果在多行中) 如何确定段落在VSTO中是否不止一行?由于“行”在Word对象模型中不是对象,由于其动态布局算法,这需要通过API中仍然内置的旧WordBasic技术来实现。(WordBasic基于选择而不是对象工作,这就是为什么这些旧方法中存在此功能。) 在这种情况下,Word.WdInformation枚举提供了使用“行”的参

我不想找到在段落(段落末尾)中按enter键的位置。我需要确定段落是包含一行还是多行,以便可以相应地格式化(居中或左对齐)

如果它在一条直线上,就在中间

或左对齐(如果在多行中)

如何确定段落在VSTO中是否不止一行?

由于“行”在Word对象模型中不是对象,由于其动态布局算法,这需要通过API中仍然内置的旧WordBasic技术来实现。(WordBasic基于选择而不是对象工作,这就是为什么这些旧方法中存在此功能。)

在这种情况下,
Word.WdInformation
枚举提供了使用“行”的参数,更具体地说,是针对这个问题
wdFirstCharacterLineNumber

下面的示例代码包含一个代码段,该代码段对文档的特定段落调用
IsParaOneLine

IsParaOneLIne
复制段落
范围
两次传递:一次用于起点,一次用于终点。然后将这些范围分别折叠到其起点和终点,并确定行号。如果两者相同,
true
返回调用代码,否则
false

注:

  • rngEnd.MoveEnd(Word.WdUnits.wdCharacter,-1)将结束点向后移动一个字符,因为在折叠到段落
    范围
    末尾后,
    范围
    位于下一段落的开头。这会将其移回原始段落

  • 该示例应用样式而不是“直接格式化”。我强烈建议使用样式,而不是在整个文档中使用居中和左对齐设置格式。如果没有具有所需格式的内置样式,请创建所需的自定义样式。如果你熟悉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;
    }
    

  • 请注意,对于这样的问题,发布一些“框架”代码总是一个好主意,为人们提供一个起点。否则1)我们必须从头开始写;2) 我们提供的代码将与您的代码更加匹配。减少每个人的工作量。下面的贡献回答了你的问题吗?