Word VSTO 加载项:删除 GroupContentControl

Word VSTO Add-In : Deleting GroupContentControl

我正在开发我的第一个 Word VSTO 加载项。除其他外,我需要它使某些段落只读,但不是永久的。我正尝试在 运行 时使用 GroupContentControls(简称 GCC)来达到这种效果。

我已经掌握了 GCC 的创建过程:这很简单,我只是使用了 MSDN 上的示例。但是,我好像无法删除GCC。

这是我试过的代码:

// Get a VSTO document object
Document doc = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument); 
// Find the GCC in the document, by its ID
var controls = from GroupContentControl g in doc.Controls
               where g.ID.Equals(gcc_ID)
               select g;
// Safety check
if (controls == null)
    return;
if (controls.Count() == 0)
    return;
// Delete the GCC
var gc = controls.First();
gc.Delete(false);

为了简洁起见,我只列出了不起作用的代码。加载项的其余部分的设计方式是,当活动 Word 文档包含 ID 匹配 gcc_ID.

的 GroupContentControl 时,此代码仅 运行s

我在 运行 时遇到了三种错误:

有没有更简单更好的方法来删除 GroupContentControl,知道它的 ID?我是 .NET 的新手,也是 VSTO 的新手,我可能遗漏了一些对您来说非常明显的东西。

调试此类内容时,第一步是使用 "native" Word 对象 (Microsoft.Office.Interop.Word) 并确保该级别的所有内容都正常工作。

如果您不需要 VSTO 对象,请不要使用它们 - 坚持使用本机对象。我完全不清楚为什么需要 VSTO GroupContentControl 对象——据我所知,组内容控件没有特殊的 VSTO 功能。

尽管如此,如果您需要加载项中的 VSTO 对象,在 运行 时,您必须创建它们 - 每次加载项 运行秒。下面的代码就是这样做的。您应该从 native Word 文档开始,因为稍后您将需要它。

然后从本机 Word 文档创建一个 VSTO 文档对象。您基本上已经知道了,但应该从本机对象开始,而不是返回到 Globals...ActiveDocument。请注意,我的代码在这方面与您的略有不同,因为我针对的是不同的 .NET Framework。您应该继续使用 Globals.Factory.GetVstoObject...

下一步是获取原生组内容控件。由于您有一个静态 ID,并且您只想检索一个内容控件,因此无需使用 lamda、集合或其他任何内容,直接对其进行寻址即可:doc.ContentControls[gcc_ID];

您可以从本机内容控件添加 GroupContentControl 类型的 VSTO 内容控件。此对象是动态的,一旦加载项超出范围,将不会保留在文档(或其他任何地方)中。

从现在开始,你应该没事了。

    private void btnGroupCC_Click(object sender, RibbonControlEventArgs e)
    {
        Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
        // Get a VSTO document object
        Microsoft.Office.Tools.Word.Document VSTOdoc = Microsoft.Office.Tools.Word.Extensions.DocumentExtensions.GetVstoObject(doc);
        // Find the GCC in the document, by its ID
        string gcc_ID = "778611894";
        Word.ContentControl cc = doc.ContentControls[gcc_ID];
        Microsoft.Office.Tools.Word.GroupContentControl gcc = VSTOdoc.Controls.AddGroupContentControl(cc, "groupCC");
        // Safety check
        if (gcc == null)
            MessageBox.Show("no group cc");

        // Delete the GCC

        gcc.Delete(false);
    }

参考:https://msdn.microsoft.com/en-us/library/bb386200.aspx#runtimeaddin,关于在 运行 时添加内容控件的主题。