从 Visio VSSX 文档导入形状

Import a shape from Visio VSSX document

我有一个包含一些形状的 Visio 模具文档,我想将其中包含的一个形状添加到我的文档中。基于 this example 我能够做到,唯一的问题是如何摆脱使用 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:\Users\user\Desktop\stencil.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();

您可以在 'hidden' 状态下打开模板文档,也可以使用 Masters.Drop 方法直接添加到目标母版集合中,如下所示:

var targetDoc = vApp.Documents.Add("");
var sourceDoc = vApp.Documents.OpenEx(
    @"c:\Users\user\Desktop\stencil.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);