C# Visio 容器

C# Visio Containers

我正在努力获取使用 C# 的容器的内容(子级)。 如果只是在页面上绘制,效果很好,但一旦转换为母版,它就不再被识别为 'container'。

因此,例如。 从 'Insert' 选项卡创建一个新容器。 从 'Home' 选项卡中,在容器中绘制 2 个矩形,在每个矩形中键入一些文本,然后 'add to underlying container'.

在此之后,下面的代码报告了 2 个矩形名称和文本。

但是,我现在将容器拖到我的模板中以创建母版。 然后我把母版拖到页面创建一个实例。

现在代码根本找不到任何 MemberShapes。

我做错了什么? 任何 advice/guidance 表示赞赏!!

    foreach (Microsoft.Office.Interop.Visio.Shape shape in Globals.ThisAddIn.Application.ActivePage.Shapes)
                {

                    System.Diagnostics.Debug.WriteLine(shape.Name);

                    if (shape.ContainerProperties != null) {
                        foreach (int memberID in shape.ContainerProperties.GetMemberShapes(0)) {
                            Microsoft.Office.Interop.Visio.Shape vsoShape = Globals.ThisAddIn.Application.ActivePage.Shapes.ItemFromID[memberID];
                            Debug.Print(vsoShape.Name);
                            Debug.Print(vsoShape.Text);
                        }
                    }
}

我怀疑是你的杰作给你带来了麻烦。如果您将新容器拖到文档模板上以创建母版,则成员形状会随之而来。但是,Visio 喜欢将母版分组,如果不是,它会在放置时将它们分组。如果您取消组合您的新实例形状(容器和成员),然后再次 运行 您的代码,它应该按预期报告。这样做的问题是它破坏了 master 的 link。

我认为您需要将形状分解为单独的成员和容器母版。

如果要删除列表类型的容器形状,则可以使用 User.msvSDListItemMaster + EventDrop 组合命令 Visio 删除其他列表项形状。 (有关详细信息,请参阅 Custom Containers, Lists and Callouts in Visio 2010 post 的 "Specifying a shape to insert into lists" 部分。)不幸的是,这不适用于直容器形状,因为新成员形状的放置位置未知。

如果您想要一个预填充的容器,那么一种选择是在代码中侦听放置事件并在处理程序中添加新成员,或者使用 EventDrop 单元格中的 QUEUEMARKEREVENT ShapeSheet 函数触发 MarkerEvent .同样,这意味着您随后需要监听和处理应用程序标记事件。

我不知道您对 Visio 事件有多熟悉,但我在此处找到的视频的代码部分介绍了它们:

http://visualsignals.typepad.co.uk/vislog/2016/04/new-visio-training-videos.html

2017 年 12 月 13 日更新 - 添加相关课程文件 post,课程中使用的演示代码:

http://visualsignals.typepad.co.uk/vislog/2017/01/course-files-for-visio-flyby-for-developers-on-ch9.html