我正在努力使用C#访问Container的内容(子)。 如果只是在页面上绘制,则工作正常,但一旦转换为母版,它就不再被识别为'容器'。
所以,例如。 从'插入'创建一个新容器。标签。 来自' Home'选项卡,在容器中绘制2个矩形,在每个矩形中键入一些文本,然后“添加到底层容器”。
在此之后,下面的代码报告2个矩形名称&文本。
但是,我现在将容器拖到我的模板中以创建一个主人。 然后我将主页拖到页面上以创建实例。
现在代码根本找不到任何MemberShapes。
我做错了什么? 任何建议/指导赞赏!!
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);
}
}
}
答案 0 :(得分:1)
这是你的主人创造,我怀疑给你带来麻烦。如果您将新容器拖到文档模板上以创建母版,则会使用成员形状。但是,Visio喜欢将主人分组,如果他们不是,它会将它们分组。如果您取消组合新的实例形状(容器和成员),然后再次运行代码,它应按预期进行报告。这个问题是它打破了与主人的联系。
我认为你需要将你的形状分解成单独的成员和容器主人。
如果要删除List类型容器形状,则可以指示Visio使用User.msvSDListItemMaster + EventDrop组合删除其他列表项形状。 (有关更多详细信息,请参阅Custom Containers, Lists and Callouts in Visio 2010帖子中的“指定要插入列表的形状”部分。)不幸的是,这对于直接容器形状不起作用,因为新成员形状的放置位置未知。
如果你想拥有一个预先填充的容器,那么一个选项是在代码中监听drop事件并在处理程序中添加新成员,或者从EventDrop单元格中使用QUEUEMARKEREVENT ShapeSheet函数触发MarkerEvent。同样,这意味着您需要监听并处理应用程序标记事件。
我不知道您对Visio事件有多熟悉,但我在这里的视频的代码部分中介绍了它们:
http://visualsignals.typepad.co.uk/vislog/2016/04/new-visio-training-videos.html
2017年12月13日更新 - 同时添加相关课程文件,课程中使用的演示代码: