为什么VSTO Word ContentControl没有Name属性?

时间:2011-02-18 22:37:42

标签: c# .net ms-word ms-office vsto

当您add VSTO(非Word原生)content control时,您指定名称:

controls.AddContentControl(wordRange, "foo", wdType);

其中控件是VSTO(扩展)Document.Controls集合。

您可以稍后look up按名称控制:

ContentControl myContentControl = controls["foo"];

那么为什么世界上没有ContentControl的Name属性? (或ContentControlBase,或任何其他衍生物)。

我正在为Document.Controls属性实现一个包装类,它允许您添加或迭代内容控件。迭代底层的Document.Controls时,无法查找每个控件的名称。 (我们需要它来返回ContentControl包装器的实例)。所以目前我在ContentControls包装类中这样做:

    public IEnumerator<IContentControl> GetEnumerator()
    {
        System.Collections.IEnumerator en = this.wordControls.GetEnumerator();
        while (en.MoveNext())
        {
            // VSTO Document.Controls includes all managed controls, not just 
            // VSTO ContentControls; return only those.
            if (en.Current is Microsoft.Office.Tools.Word.ContentControl)
            {
                // The control's name isn't stored with the control, only when it was added,
                // so use a placeholder name for the wrapper.
                yield return new ContentControl("Unknown", (Microsoft.Office.Tools.Word.ContentControl)en.Current);
            }
        }
    }

我宁愿不必在ContentControls对象中保留名称到包装对象的映射。谁能告诉我如何获取控件的名称(传递给Controls.Add()的名称参数?

1 个答案:

答案 0 :(得分:4)

当您以编程方式添加CC然后需要在同一个Word实例中立即访问它时,“name”参数纯粹是为了便于操作。事后对CC的访问是通过ContentControl.ID属性中的GUID进行的。所以在这个意义上,“name”对于以后的访问和操作来说是相当无用的,因为它不会保留在WordprocessingML标记中。

接近它的一种更简单的方法是一起忽略“名称”指定,添加CC,抓住它.ID然后使用它。当然,Guid对于人类读者来说毫无意义,但是你的程序应该能够解释它。

如果您确实需要通过有意义的名称(例如“foo”)获取CC,只需使用.Tag属性作为CC的名称(尽管对于您的标记,它只需要对每个CC都是唯一的作为名称工作)并通过标签查询ContentControlCollection。