Импортировать фигуру из документа Visio VSSX

#c# #vsto #office-addins #visio

#c# #vsto #office-дополнения #visio

Вопрос:

У меня есть документ-трафарет Visio с некоторыми фигурами, и я хочу добавить фигуру, содержащуюся внутри него, в мой документ. Основываясь на этом примере, я смог это сделать, единственная проблема заключается в том, как избавиться от панели dock, которая появляется при открытии трафарета с помощью Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenDocked флага.

Итак, после импорта я закрываю открытый документ с трафаретом, но панель dock остается. Возможно, я мог бы закрыть ее и программно, но тогда я должен рассмотреть сложную логику с отслеживанием того, было ли это открыто или нет, чтобы сохранить пользовательский интерфейс неизменным, если пользователь ранее открывал эту панель и т.д.

Мой вопрос, есть ли другой вариант импорта фигуры из трафарета или обходной путь для этой панели и параметров открытия документа трафарета (например, открыть скрытый для пользователя документ трафарета и закрыть его после этого беззвучно)

             // Microsoft.Office.Interop.Visio.Application Application
            var documents = Application.Documents;
            var document = documents.Add("");
            var page = Application.ActivePage;
            var visioStencil = documents.OpenEx(
                @"c:UsersuserDesktopstencil.vssx",
                (short)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenDocked);
            var masters = visioStencil.Masters;

            for (var i = 1; i <= masters.Count;   i)
            {
                var item = masters.get_ItemU(i);
                var name = item.Name;

                if (name == "Master.2")
                {
                    page.Drop(item, 10, 10);
                    break;
                }
            }

            visioStencil.Close();
  

Ответ №1:

Вы можете открыть документ с трафаретом в «скрытом» состоянии, а также использовать Masters.Drop метод для добавления непосредственно в целевую коллекцию шаблонов следующим образом:

 var targetDoc = vApp.Documents.Add("");
var sourceDoc = vApp.Documents.OpenEx(
    @"c:UsersuserDesktopstencil.vssx",
    (short)Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visAddHidden);
var sourceMasters = sourceDoc.Masters;

for (var i = 1; i <= sourceMasters.Count;   i)
{
    var sourceMaster = sourceMasters[i];
    if (sourceMaster.Name == "Master.2")
    {
        targetDoc.Masters.Drop(sourceMaster, 10, 10);
        break;
    }
}

sourceDoc.Close();
  

Обратите внимание, что если целевой документ уже содержит образец с тем же именем, Visio создаст новый образец и добавит номер в конце. Кроме того, имейте в виду, что Name и NameU могут отличаться, поэтому вы можете захотеть сопоставить их с последним.

Ответ №2:

Нет необходимости перебирать все фигуры в трафарете. Вы можете получить доступ к фигуре по имени:

 targetDoc.Masters.Drop(sourceMasters["Master.2"], 10, 10);