C# 在Word中将shape/inlineshape设置为装饰性

C# 在Word中将shape/inlineshape设置为装饰性,c#,ms-word,office365,vsto,accessibility,C#,Ms Word,Office365,Vsto,Accessibility,在Office 365中,Microsoft为形状/InlineShapes(图片)引入了一个新属性:装饰性 我可以使用这里演示的VBA操作它,但不能使用VSTO,这正是我真正需要的 值类型为Microsoft.Office.Core.mSortistate,如果设置为mSortue,则在图片上启用该功能 我已经能够使用VBA轻松切换此功能,如下所示(要尝试此功能,只需在Microsoft Word 365中的空文档中插入一个内联图像即可) 这将切换活动文档中第一个InLineShape的装饰属

在Office 365中,Microsoft为形状/InlineShapes(图片)引入了一个新属性:
装饰性

我可以使用这里演示的
VBA
操作它,但不能使用
VSTO
,这正是我真正需要的

值类型为Microsoft.Office.Core.mSortistate,如果设置为mSortue,则在图片上启用该功能

我已经能够使用
VBA
轻松切换此功能,如下所示(要尝试此功能,只需在
Microsoft Word 365
中的空文档中插入一个内联图像即可)

这将切换活动文档中第一个InLineShape的装饰属性

但实际问题是:

我需要从
VSTO
C#
VB.NET
)执行此操作,但是属性
.Decorative
在Intellisense中不可用,即使我尝试通过将
InlineShape
对象键入
Dynamic
来强制执行,它在执行代码时也会崩溃

我正在使用此Office Interop nuGet捆绑包与Word进行交互:
Bundle.Microsoft.Office.Interop
版本
15.0.4569
日期为2018年10月23日
。
该捆绑包包含Microsoft Excel、Outlook、PowerPoint和Word的互操作资源

我也尝试过使用Microsoft.Office.Interop.Word,但它已经有两年的历史了,所以它显然也不包含这个新功能

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

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


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

确实是一个有趣的问题。起初,我认为可以通过将对
Microsoft.Office.Interop.Word的引用设置为GAC中的PIA,而不是Visual Studio(VSTO项目的默认源代码)安装的PIA,并将“嵌入互操作类型”设置为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);
    }

有趣的方法,我不会想到这一点:-)它是有效的,非常感谢:-)我确实希望它很快就能在IntelliSense上正式提供,但这是一个很好的修复,直到那天!
    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);
    }