在Word

时间:2018-10-29 09:56:35

标签: c# ms-word office365 vsto accessibility

Microsoft在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属性。

Before code executed

After code executed

但这是实际的问题:

我需要从VSTOC#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 的Interop资源。

我也尝试使用Microsoft.Office.Interop.Word,但是它已经使用了两年左右,因此它显然也不包含此新功能。

我希望有人能在正确的方向帮助我。

使用有关可访问文档的新欧盟法律,这是使用Microsoft Word生成PDF文档时的 关键功能

或者:是否可以通过VBA以某种方式VSTO动态执行此操作,而无需在文档中创建宏等?我猜不是,至少在没有启用对对象模型的信任的情况下,这不是可行的选择:-/

1 个答案:

答案 0 :(得分:2)

确实是一个有趣的问题。最初,我认为可以通过将对GAC中的PIA的引用Microsoft.Office.Interop.Word设置为引用,而不是通过Visual Studio(VSTO项目的默认源)安装的引用并设置为“嵌入互操作”来解决类型”设置为false。但是,两者都没有效果。

这只剩下使用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);
    }