我想要的是不查找段落(段落的结尾)中按下Enter的位置。我需要确定一个段落是包含一行还是多行,以便可以对其进行相应的格式设置(居中或左对齐)。
如果在一行中,请像这样居中
或在多行中左对齐
如何确定段落在VSTO中是否超过一行?
由于“行”不是Word对象模型中的对象,由于其动态布局算法,因此需要通过仍内置在API中的旧WordBasic技术来解决。 (WordBasic基于选择而不是对象工作,这就是为什么在这些旧方法中都具有此功能的原因。)
在这种情况下,Word.WdInformation
枚举提供了与“行”一起使用的参数,更具体地说是针对此问题wdFirstCharacterLineNumber
。
以下示例代码包含一个代码片段,该片段在文档的特定段落上调用IsParaOneLine
。
IsParaOneLIne
重复项段落Range
通过了两次[:一次是起点,一次是终点。然后将这些范围分别折叠到其起点和终点,并确定行号。如果两者相同,则将true
返回到调用代码,否则返回false
。
rngEnd.MoveEnd(Word.WdUnits.wdCharacter, -1);
将端点后移一个字符,因为在折叠到段落Range
的末尾后,Range
位于下一段的开头。这会将其移回原始段落。[Styles
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;
}