Надстройка Word VSTO: удаление GroupContentControl - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над своей первой надстройкой Word VSTO. Помимо прочего, мне нужно, чтобы некоторые абзацы были доступны только для чтения, но не постоянно. Я пытаюсь использовать GroupContentControls (GCC для краткости) во время выполнения для этого.

У меня есть процесс создания GCC: это было легко, я просто использую пример на MSDN. Тем не менее, я не могу удалить GCC.

Вот код, который я пробовал:

// Get a VSTO document object
Document doc = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument); 
// Find the GCC in the document, by its ID
var controls = from GroupContentControl g in doc.Controls
               where g.ID.Equals(gcc_ID)
               select g;
// Safety check
if (controls == null)
    return;
if (controls.Count() == 0)
    return;
// Delete the GCC
var gc = controls.First();
gc.Delete(false);

Ради краткости я перечисляю только код, который не работает. Остальная часть надстройки разработана таким образом, что этот код выполняется только тогда, когда активный документ Word содержит GroupContentControl с идентификатором, совпадающим с gcc_ID.

Я получаю три типа ошибок во время выполнения:

  • Код работает без сбоев, но GCC все еще на месте, что заставляет меня поверить, что один из моих тестов безопасности сработал и код вернулся преждевременно
  • Код зависает при вызове Delete за исключением того, что gc не является GroupContentControl.
  • В начале отладки у меня также было исключение при назначении переменной gc, потому что «controls» было «null» ... что было странно, потому что тест безопасности перед сбоем не срабатывал. Но я не могу воспроизвести этот конкретный результат.

Существует ли более простой и лучший способ удаления GroupContentControl, зная его идентификатор? Я довольно плохо знаком с .NET и очень плохо знаком с VSTO, возможно, я упускаю что-то очень очевидное для вас.

1 Ответ

0 голосов
/ 09 мая 2018

При отладке такого рода вещей первым делом необходимо поработать с «родными» объектами Word (Microsoft.Office.Interop.Word) и убедиться, что все на этом уровне работает нормально.

Если вам не нужны объекты VSTO, не используйте их - придерживайтесь нативных объектов. Мне совершенно непонятно, зачем вам нужен объект VSTO GroupContentControl - насколько я знаю, специальных функций VSTO для управления контентом группы не существует.

Как бы то ни было, если вам нужны объекты VSTO в надстройке, во время выполнения вы должны создавать их - каждый раз, когда запускается ваша надстройка. Следующий код делает это. Вам следует начать с документа native Word, потому что он вам понадобится позже.

Затем создайте объект документа VSTO из исходного документа Word. В принципе, у вас это есть, но вы должны начинать с собственного объекта, а не возвращаться к глобальным ... ActiveDocument Обратите внимание, что мой код немного отличается от вашего в этом отношении, поскольку я нацеливаюсь на другую .NET Framework. Вы должны продолжать использовать Globals.Factory.GetVstoObject...

Следующий шаг - получить контроль над содержимым собственной группы. Поскольку у вас есть статический идентификатор, и вы хотите получить только один элемент управления содержимым, просто обращайтесь к нему напрямую без лямд, или коллекций, или чего-либо еще: doc.ContentControls[gcc_ID];

Из встроенного элемента управления содержимым вы можете добавить элемент управления содержимым VSTO типа GroupContentControl. Этот объект является динамическим и не будет сохранен в документе (или где-либо еще), как только надстройка выйдет из области видимости.

С этого момента вы должны быть в порядке.

    private void btnGroupCC_Click(object sender, RibbonControlEventArgs e)
    {
        Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
        // Get a VSTO document object
        Microsoft.Office.Tools.Word.Document VSTOdoc = Microsoft.Office.Tools.Word.Extensions.DocumentExtensions.GetVstoObject(doc);
        // Find the GCC in the document, by its ID
        string gcc_ID = "778611894";
        Word.ContentControl cc = doc.ContentControls[gcc_ID];
        Microsoft.Office.Tools.Word.GroupContentControl gcc = VSTOdoc.Controls.AddGroupContentControl(cc, "groupCC");
        // Safety check
        if (gcc == null)
            MessageBox.Show("no group cc");

        // Delete the GCC

        gcc.Delete(false);
    }

Ссылка: https://msdn.microsoft.com/en-us/library/bb386200.aspx#runtimeaddin, тема о добавлении элементов управления содержимым во время выполнения.

...