1

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

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

我在下面管理/找到/修补的大部分内容。

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 个内容控制。我正在工作的当前一个。我想找到它的范围并将其分配给一个值。然后在那个范围的“文本”中,我想做一些[花哨的]突出显示。

4

2 回答 2

2

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

所以我使用的方法是

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

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

        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;
    }
于 2019-11-18T20:21:40.927 回答
1

假设您的意思是插入点位于内容控件内,并且您的 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]

但是,在处理内容控件时,请注意在 UI 中选择内容控件与选择“内容控件的范围”是不同的。以编程方式,如何选择范围很明显 - 如何选择控件并不那么明显。如果您选择 Range,ParentContentControl 应该是您选择其范围的控件。如果您(或用户)选择了控件,OTTOMH 我不太确定。

于 2019-11-18T20:27:58.113 回答