当您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()的名称参数?
答案 0 :(得分:4)
当您以编程方式添加CC然后需要在同一个Word实例中立即访问它时,“name”参数纯粹是为了便于操作。事后对CC的访问是通过ContentControl.ID
属性中的GUID进行的。所以在这个意义上,“name”对于以后的访问和操作来说是相当无用的,因为它不会保留在WordprocessingML标记中。
接近它的一种更简单的方法是一起忽略“名称”指定,添加CC,抓住它.ID
然后使用它。当然,Guid对于人类读者来说毫无意义,但是你的程序应该能够解释它。
如果您确实需要通过有意义的名称(例如“foo”)获取CC,只需使用.Tag
属性作为CC的名称(尽管对于您的标记,它只需要对每个CC都是唯一的作为名称工作)并通过标签查询ContentControlCollection。