#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);