【问题标题】:VSTO Word Content Control - adding multiple RichTextContentControls at run timeVSTO Word 内容控件 - 在运行时添加多个 RichTextContentControls
【发布时间】:2015-11-28 15:05:30
【问题描述】:

我正在创建一个 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.

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

谁能指点我正确的方向。

【问题讨论】:

  • “我想不出正确的方法” - 好吧,也许以“一种方式”开头,例如遍历控件,选择现有标题,并想办法避免重复现有标题?

标签: c# ms-word vsto add-in word-addins


【解决方案1】:

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

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";
            }

        }

【讨论】:

  • 是的,这是“标准”——某种集合和递增的名称。如果您不需要内容控件的 VSTO 扩展,您可以在“互操作”级别插入它们,那么您就不会遇到这个问题。 “名称”仅适用于 VSTO - Word 本身不需要它。
  • 请花一点时间单击“答案”旁边的复选标记。这有助于论坛管理,并且对可能有相同或类似问题的其他人有用。
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多