使一个形状置于最顶层

7

在我的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成为文档中最顶部的东西(也就是说,它出现在所有其他东西的上面)?

2个回答

8

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

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

问题在于我将我的形状对象添加到了一个页眉页脚部分中,但是显示在其上方的形状是在文档中定义的。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);
编写Word宏(第二版)非常明确地表明:

ZOrder方法设置与其他对象相对的形状对象的Z顺序。请注意,该方法不会设置绝对Z顺序。

因此,绝对的Z顺序取决于其他因素,例如在此情况下Shape实际上位于何处。

4

如果您想在Word中手动执行此操作,可以选择“在文本前置于最前面”的选项。您可以尝试使用以下代码:

shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);

如果因为其他对象的原因而无法实现,请尝试依次使用以下代码:

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

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

@Alexandru 或许你的链接实际上已经回答了你的问题,因为 Z-order 没有多个对象参与其中是没有意义的。除非你的形状是最后一个接收 Z-order 命令的对象,否则似乎没有内置的方法可以覆盖它。毫无疑问,这是设计上的考虑。祝你好运寻找规范答案,因为你自己的链接显示的与你想要的不同。 - vbnet3d
这个语句纯粹是你对我链接的片段的解释:除非你的形状是最后一个接收Z-order命令的,否则似乎没有内置的方法可以覆盖它。 在片段中并没有说这一点。它暗示了它不会设置绝对Z-order,并且它确实说它相对于其他对象工作。有一个原因它会这样暗示,我想知道那个原因,但请相信我,这不是你可能的解释。模板肯定会引入出现在我的上方的对象。请尊重问题。 - Alexandru
这确实意味着最后设置的Z顺序具有优先权,但显然,我们刚刚尝试使用您的建议shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);shape.ZOrder(MsoZOrderCmd.msoBringToFront);来设置最后的Z顺序,但我们发现它没有任何作用。因此,我认为这里缺少的是形状之间相对性的一些内容。例如,某些形状可能位于不同的部分中。那么,您将如何为它们设置Z顺序? - Alexandru
你说得对,目前我似乎对你的帮助不太感兴趣,因为你似乎认为你的假设都是正确的...但是,公平地说...我很感激你的帮助。我很感激任何人试图提供帮助。但一旦人们变得太固执,我就会划清界限。此外,我要补充的是,你可以在Word中的Office中看到这个功能,所以可能有一种方法可以实现它。 - Alexandru
我的形状是在你的答案中最后接收Z顺序命令的,但它并不是最顶层的。那么,你想要我怎么做?你的答案不起作用! - Alexandru
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接