Как установить ContentControl.Range в текущий ContentControl, с которым я работаю?

Я не нахожу способ установить ContentControl.Range.Text, откуда выполняется С# (внутри элемента управления содержимым). Возможно, мне стоит посмотреть на это совсем с другой точки зрения.

В настоящее время у меня есть элемент управления содержимым, который создает набор текста с некоторым текстом между [] квадратными скобками, и я хочу выбрать текст и отформатировать цвет, установив начало и конец диапазона символов между []. Я застрял, пытаясь установить начальный диапазон для элемента управления контентом, который я сейчас использую.

Большая часть того, что мне удалось/нашел/исправил ниже.

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 элемент управления контентом. Текущий, над которым я работаю. Я хочу найти его диапазон и присвоить ему значение. Затем в «тексте» этого диапазона я хочу выделить [причудливое] выделение.


person Rynharok    schedule 18.11.2019    source источник


Ответы (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;
    }
person Cindy Meister    schedule 18.11.2019
comment
Спасибо Синди, Йокки за оперативные ответы! У меня еще не было времени попробовать его, но я сообщу о своих результатах. - person Rynharok; 20.11.2019

Предполагая, что вы имеете в виду, что точка вставки находится внутри элемента управления содержимым, а ваш объект приложения Word называется oWord, тогда вы можете получить диапазон этого элемента управления содержимым, используя, например.

Microsoft.Office.Interop.Word.Range r = oWord.Selection.Range.ParentContentControl.Range

Если у вас есть вложенные элементы управления, вы можете убедиться, что точка вставки находится в элементе управления содержимым (я думаю, Word 2013 и более поздние версии), проверив значение inCC следующим образом:

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

Однако при работе с элементами управления содержимым помните, что выбор элемента управления содержимым в пользовательском интерфейсе отличается от выбора «диапазона элемента управления содержимым». Программно очевидно, как выбрать диапазон, но не так очевидно, как выбрать элемент управления. Если вы выберете Range, ParentContentControl должен быть элементом управления, диапазон которого вы выбрали. Если вы (или пользователь) выбрали элемент управления, OTTOMH, я не уверен.

person Community    schedule 18.11.2019
comment
FWIW Если бы Синди Мейстер написала, когда я начал писать свой пост, я бы не стал продолжать. Мою, пожалуй, лучше игнорировать. - person ; 18.11.2019
comment
На самом деле, я не могу поверить, что не обнаружил Selection.Range.ParentContentControl, так что я рад, что вы продолжили! - person Cindy Meister; 20.11.2019
comment
@CindyMeister Я собираюсь предположить, что вы обнаружили ParentContentControl, когда впервые появились элементы управления контентом, но, возможно, не смогли заставить его делать то, что хотели. Может быть, вы все равно нашли способ, который сработал. Я немного осмотрюсь и посмотрю, смогу ли я найти какие-либо возможности для улучшения вопроса или ответа. Тогда я удалю свои комментарии. - person ; 20.11.2019