在 Office 365 中,微软为 Shapes / InlineShapes(图片)引入了一个新属性:
Decorative
我可以使用
VBA
来操作它,如此处所示,但不能使用 VSTO
操作它,这是我真正需要的。值类型为
Microsoft.Office.Core.MsoTriState
,如果设置为 msoTrue,则会启用图片上的功能。我已经能够使用
VBA
轻松切换此功能,如此处所示(要尝试它,只需在
Microsoft Word 365
的空文档中插入内联图像)
Sub ToggleDecorativePic()
Dim pic As InlineShape
Set pic = ActiveDocument.InlineShapes(1)
pic.Decorative = Not pic.Decorative
End Sub
这将切换活动文档中第一个 InLineShape 的 Decorative 属性。*但这就是实际的问题:
我需要从
VSTO
(
C#
或
VB.NET
)执行此操作,但属性
.Decorative
在Intellisense中不可用,即使我尝试通过将
InlineShape
对象强制转换为
Dynamic
来强制执行此操作,它只是在执行代码时崩溃。我正在使用此 Office Interop nuGet 捆绑包与 Word 进行交互:
Bundle.Microsoft.Office.Interop
版本
15.0.4569
日期为
October 23rd 2018
,因此它应该是最新的。该捆绑包包含 Microsoft Excel、Outlook、PowerPoint 和 Word 的互操作资源。我也尝试过使用
Microsoft.Office.Interop.Word
,但它已经有两年了,所以它显然也不包含这个新功能。根据有关无障碍文档的新欧盟法律,这是使用 Microsoft Word 生成 PDF 文档时的一个关键功能。
或者:是否可以以某种方式从
VSTO
以 VBA 形式动态执行此操作,而无需在文档等中创建宏?我猜不会,至少在不启用对对象模型的信任的情况下不会,这不是一个可行的选择:-/
Microsoft.Office.Interop.Word
的引用设置为 GAC 中的 PIA 而不是 Visual Studio 安装的 PIA(这是 VSTO 项目的默认源)并设置“嵌入互操作类型”来解决这个问题为假。然而,两者都没有效果。只剩下使用
PInvoke
的选项,这对我有用:
Word.InlineShape ils = doc.InlineShapes[1];
object oIls = ils;
object isDec = oIls.GetType().InvokeMember("Decorative", System.Reflection.BindingFlags.GetProperty, null, oIls, null);
System.Diagnostics.Debug.Print("Is the InlineShape marked as decorative: " + isDec.ToString());
if ((int)isDec != -1)
{
object[] arg = new object[] { -1 };
oIls.GetType().InvokeMember("Decorative", System.Reflection.BindingFlags.SetProperty, null, oIls, arg);
}