C# VSTO Word内容控件-在运行时添加多个RichTextContentControl

C# VSTO Word内容控件-在运行时添加多个RichTextContentControl,c#,ms-word,vsto,add-in,word-addins,C#,Ms Word,Vsto,Add In,Word Addins,我正在创建一个Word加载项,它允许用户选择Word文档中的各种文本,然后单击功能区上的按钮,该按钮将使用内容控件(富文本)包装该文本。最终,这些内容控件将映射到XML 到目前为止,代码如下所示: public partial class Ribbon1 { private RichTextContentControl titleRichTextControl; private void Ribbon1_Load(object sender, Ribbo

我正在创建一个Word加载项,它允许用户选择Word文档中的各种文本,然后单击功能区上的按钮,该按钮将使用内容控件(富文本)包装该文本。最终,这些内容控件将映射到XML

到目前为止,代码如下所示:

public partial class Ribbon1
    {
        private RichTextContentControl titleRichTextControl;

        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void addTitle_Click(object sender, RibbonControlEventArgs e)
        {
            AddRichTextControlAtSelection();
        }


        private void AddRichTextControlAtSelection()
        {
            word.Document currentDocument = Globals.ThisAddIn.Application.ActiveDocument;

           currentDocument.ActiveWindow.Selection.Range.Select();

           Document extendedDocument = Globals.Factory.GetVstoObject(currentDocument);

            titleRichTextControl = extendedDocument.Controls.AddRichTextContentControl("titleRichTextControl");
            titleRichTextControl.PlaceholderText = "Enter the title";
            titleRichTextControl.Title = "Title";
            titleRichTextControl.Tag = "title";

        }

    }
所有这些都很好,并且在第一次单击按钮时就可以正常工作。但是,如果有多个“标题”(在本例中)需要添加,并且用户再次按下按钮,则会抛出错误:

The control cannot be added because a control with the name titleRichTextControl already exists in the Controls collection.

它抱怨的原因很清楚,但我想不出正确的方法来允许多次单击按钮以生成相同类型(富文本内容控件)和相同名称(例如“标题”)的多个内容控件


有人能给我指一下正确的方向吗。

好的,我最后就是这样做的:

private void addTitle_Click(object sender, RibbonControlEventArgs e)
        {
            AddRichTextControlAtSelection();
        }


        int count = 0;
        private void AddRichTextControlAtSelection()
        {
            word.Document currentDocument = Globals.ThisAddIn.Application.ActiveDocument;

            Document extendedDocument = Globals.Factory.GetVstoObject(currentDocument);

            if (currentDocument.ContentControls.Count > 0)
            {

                currentDocument.ActiveWindow.Selection.Range.HighlightColorIndex = word.WdColorIndex.wdYellow;
                currentDocument.ActiveWindow.Selection.Range.Select();

                richTextControls = new List<RichTextContentControl>(); 

                foreach (word.ContentControl nativeControl in currentDocument.ContentControls)
                {
                    if (nativeControl.Type == Microsoft.Office.Interop.Word.WdContentControlType.wdContentControlRichText) 
                    {
                        count++;
                        RichTextContentControl tempControl = extendedDocument.Controls.AddRichTextContentControl("VSTORichTextControl" + count.ToString());
                        richTextControls.Add(tempControl);
                        tempControl.Title = "Title";
                        tempControl.Tag = "title";

                        break;
                     }
                }
            }

            else
            {
                RichTextContentControl VSTORichTextControl;
                VSTORichTextControl = extendedDocument.Controls.AddRichTextContentControl("VSTORichTextControl");
                VSTORichTextControl.PlaceholderText = "Enter the DM title";
                VSTORichTextControl.Title = "Title";
                VSTORichTextControl.Tag = "title";
            }

        }
private void addTitle\u单击(对象发送者,RibbonControlEventArgs e)
{
AddRichTextControlAtSelection();
}
整数计数=0;
私有void AddRichTextControlAtSelection()
{
word.Document currentDocument=Globals.ThisAddIn.Application.ActiveDocument;
Document extendedDocument=Globals.Factory.GetVstoObject(currentDocument);
如果(currentDocument.ContentControls.Count>0)
{
currentDocument.ActiveWindow.Selection.Range.HighlightColorIndex=word.WdColorIndex.wdYellow;
currentDocument.ActiveWindow.Selection.Range.Select();
richTextControls=新列表();
foreach(currentDocument.ContentControls中的word.ContentControl nativeControl)
{
if(nativeControl.Type==Microsoft.Office.Interop.Word.WdContentControlType.wdContentControlRichText)
{
计数++;
RichTextContentControl tempControl=extendedDocument.Controls.AddRichTextContentControl(“VSTORichTextControl”+count.ToString());
richTextControls.Add(tempControl);
tempControl.Title=“Title”;
tempControl.Tag=“title”;
打破
}
}
}
其他的
{
RichTextContentControl VSTORichTextControl;
VSTORichTextControl=extendedDocument.Controls.AddRichTextContentControl(“VSTORichTextControl”);
VSTORichTextControl.PlaceholderText=“输入DM标题”;
VSTORichTextControl.Title=“Title”;
VSTORichTextControl.Tag=“title”;
}
}

“我想不出正确的方法”-嗯,也许从“一种方法”开始,例如,遍历控件,提取现有标题,并想出一种避免重复现有标题的方法?是的,这是“标准”-某种集合和递增名称。如果内容控件不需要VSTO扩展,可以在“互操作”级别插入它们,那么就不会遇到这个问题。“名称”仅用于VSTO-Word本身不需要它。请花点时间单击“答案”旁边的复选标记。这有助于论坛管理,并对可能有相同或类似问题的其他人有用。