使形状最顶层

Making a Shape top-most

在我的 Word 加载项中,我有一个包含特定 Section 的 Word Document 对象。在这个 Section 中,我附加了一个 Shape:

var shape = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0, section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range) as Shape;

我的问题是某些 Word 文档模板的图像或其他内容出现在我的形状之上。本来我以为设置Z顺序就可以解决这个问题了:

shape.ZOrder(MsoZOrderCmd.msoBringToFront);

没有。所以我的问题是,如何绝对设置 Shape 的 Z 顺序,或者换句话说,为了使 Shape 成为您在文档中看到的最上面的东西(意思是它出现在所有其他东西之上)?

在 Word 中手动执行此操作,我 select 选项 "Bring Forward In Front of Text." 您应该尝试:

shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);

如果由于其他对象而单独使用此方法不起作用,请尝试一个接一个地使用:

shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);

这样做的原因是 MS Word 似乎将文本和其他对象视为具有不同的 Z 顺序。

我终于弄明白为什么这些方法不起作用了:

shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);

问题是我在 HeaderFooter 部分中添加了我的 Shape 对象,但显示在其上方的形状是在 Document 中定义的。 Z 顺序仅相对于您的对象所在的同一部分内的其他形状(无论您的对象是否在实际文档、页眉、页脚等中)。

因此,不要使用此代码将形状添加到特定部分:

var shape = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0, section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range) as Shape;
shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);

我使用这段代码将其直接添加到我的文档中,然后对其应用 Z 排序,它确实有效。它出现在所有其他对象之上,这些对象是我模板的一部分:

var shape = document.Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0) as Shape;
shape.ZOrder(MsoZOrderCmd.msoBringToFront);

Writing Word Macros, Second Edition 说得非常清楚:

The ZOrder method sets the z-order of a Shape object relative to other objects. Note that the method does not set the absolute z-order.

因此绝对 Z 顺序取决于其他因素,例如 Shape 在这种情况下实际驻留的位置。