从Visio VSSX文档导入形状



我有一个Visio模具文档,其中包含一些形状,我想将其中包含的形状添加到我的文档中。基于这个例子,我能够做到这一点,唯一的问题是如何摆脱在使用Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenDocked标志打开模具时出现的对接面板。

因此,在导入后,我关闭了打开的模具文档,但停靠面板保持不变。也许我也可以用程序关闭它,但我应该考虑跟踪它的复杂逻辑,无论它是打开的,还是如果用户以前打开过这个面板,不保持UI不变。

我的问题是,还有另一个从模具导入形状的选项,或者这个面板和模具文档打开选项的解决方案(例如,打开为用户隐藏的模具文档,然后安静地关闭它(

// 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();

您可以在"隐藏"状态下打开模具文档,也可以使用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将创建一个新的母版并在末尾附加一个数字。此外,请记住,NameNameU可能不同,因此您可能希望在后者上进行匹配。

无需循环浏览模具中的所有形状。您可以通过名称访问形状:

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

最新更新