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,课程中使用的演示代码:
我正在努力获取使用 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,课程中使用的演示代码: