C# 在Word中将shape/inlineshape设置为装饰性
在Office 365中,Microsoft为形状/InlineShapes(图片)引入了一个新属性: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的装饰属
装饰性
我可以使用这里演示的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);
}