如何将 ContentControl.Range 设置为我正在使用的当前 ContentControl?

How to set ContentControl.Range to the current ContentControl I am working from?

我找不到从 C# 执行的位置(在内容控件内)设置 ContentControl.Range.Text 的方法。也许我应该从一个完全不同的角度来看待它。

目前我有一个内容控件,它生成一组文本,在 [] 方括号之间包含一些文本,我想 select 文本并通过设置字符范围的开始和结束来设置颜色格式在。。之间 []。我坚持尝试将初始范围设置为我当前使用的内容控件。

我的大部分managed/found/patched都在下面。

object word;
Microsoft.Office.Interop.Word.Document _PWdDoc;

try
{
    word = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
    //If there is a running Word instance, it gets saved into the word variable
}
catch (Exception ex)
{
    //If there is no running instance, it creates a new one
    Type type = Type.GetTypeFromProgID("Word.Application");
    word = System.Activator.CreateInstance(type);
}

Microsoft.Office.Interop.Word.Application oWord = (Microsoft.Office.Interop.Word.Application) word;
_PWdDoc = oWord.ActiveDocument;

System.Collections.IEnumerator ContentX = _PWdDoc.ContentControls.GetEnumerator();
//Microsoft.Office.Interop.Word.ContentControl ContentX = Microsoft.Office.Interop.Word.ContentControls.Item[]; 
//Microsoft.Office.Interop.Word.Range rng = Microsoft.Office.Interop.Word.ContentControl.Range.Duplicate(ref ContentX);

//var rngX = Microsoft.Office.Interop.Word.ContentControl.Range(ContentX);
//Microsoft.Office.Interop.Word.ContentControl cc1 = ContentX;

请原谅我的编码混乱,但这就是我在这方面的最少经验所能想到的。

现在我已经获得了内容控件的 IEnumerator(我认为)除了我所阅读的内容之外,我不知道如何使用它,他们说要遍历 IEnumerables 来访问它们中的每一个。那不是我想做的。我想要 1 个内容控件。我正在使用的当前版本。我想找到它的范围并将其分配给一个值。然后在那个范围内的 "text" 我想做一些 [fancy] 突出显示。

确定当前选择或特定 Range 是否在内容控件中并对该内容控件执行某些操作并非易事。大多数其他 Word 对象将 return 它们是 "in" 的东西;内容控件没有。

所以我使用的方法是

  • 创建从当前选择(或特定 Range)返回到文档开头的 Range
  • 计算该范围内的内容控件数量
  • 然后检查当前选择是否与扩展范围的最后一个内容控件在同一范围内。
  • 如果是,则我知道所选内容在内容控件内,我可以访问该内容控件。

这是一些示例代码。调用我使用的函数的片段 return 信息:

        Word.Range rng = null;
        //Substitute a specific Range object if working with a Range, rather than a Selection
        Word.ContentControl cc = IsSelectionInCC(wdApp.Selection.Range);

        if ( cc != null)
        {
            rng = cc.Range;
            rng.HighlightColorIndex = Word.WdColorIndex.wdYellow;
        }

函数:

    private Word.ContentControl IsSelectionInCC(Word.Range sel)
    {
        Word.Range rng = sel.Range;
        Word.Document doc = (Word.Document) rng.Parent;
        rng.Start = doc.Content.Start;
        int nrCC = rng.ContentControls.Count;
        Word.ContentControl cc = null;
        bool InCC = false;

        rng.Start = doc.Content.Start;

        if (nrCC > 0)
        {
            if (sel.InRange(doc.ContentControls[nrCC].Range))
            {
                InCC = true; //Debug.Print ("Sel in cc")
                cc = doc.ContentControls[nrCC];
            }
            else
            {
                sel.MoveEnd(Word.WdUnits.wdCharacter, 1);
                if (sel.Text == null)
                {
                    //Debug.Print ("Sel at end of cc")
                    InCC = true;
                    cc = doc.ContentControls[nrCC];
                }
            }
        }
        return cc;
    }

假设您的意思是插入点位于内容控件内,并且您的 Word 应用程序对象称为 oWord,那么您可以使用例如

获取该内容控件的范围
Microsoft.Office.Interop.Word.Range r = oWord.Selection.Range.ParentContentControl.Range

如果您有嵌套控件您可以通过检查 inCC 的值来验证插入点是否在内容控件(我认为是 Word 2013 及更高版本)中:

Boolean inCC = (Boolean)oWord.Selection.Information[Microsoft.Office.Interop.Word.WdInformation.wdInContentControl]

但是,在处理内容控件时,请注意 select 在 UI 中创建内容控件 与 select 不同正在 "range of the content control"。以编程方式,很明显如何 select 范围 - 如何 select 控件并不那么明显。如果您 select 范围,则 ParentContentControl 应该是您已 select 编辑其范围的控件。如果您(或用户)select 编辑了控件,OTTOMH 我不太确定。