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属性。
但这是实际的问题:
我需要从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 的Interop资源。
我也尝试使用Microsoft.Office.Interop.Word
,但是它已经使用了两年左右,因此它显然也不包含此新功能。
我希望有人能在正确的方向帮助我。
使用有关可访问文档的新欧盟法律,这是使用Microsoft Word
生成PDF文档时的 关键功能 。
或者:是否可以通过VBA
以某种方式VSTO
动态执行此操作,而无需在文档中创建宏等?我猜不是,至少在没有启用对对象模型的信任的情况下,这不是可行的选择:-/
答案 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);
}