如何在Visio中用C#选择子形状?代码无法选中子形状求助
解决Visio无法通过代码选中子形状并访问其属性的问题
当你尝试通过ActiveWindow.Selection获取选中的子形状时返回Count=0,核心原因是Visio默认将组视为单个独立形状,窗口选择集合不会自动包含组内的子形状(除非进入组的编辑模式)。以下是两种可行的解决方法:
方法1:调整选择设置以包含子形状
通过设置Selection.IncludeSubShapes属性,让选择集合主动包含组内的子形状:
var app = await FlipClass.GetVisioApplicationAsync(); var page = app.ActivePage; Visio.Selection selection = page.Application.ActiveWindow.Selection; // 开启包含子形状的选项 selection.IncludeSubShapes = true; Debug.WriteLine(selection.Count); // 此时可统计到子形状数量 // 遍历选中的子形状并获取属性 foreach (Visio.Shape shape in selection) { Debug.WriteLine($"形状名称: {shape.Name}, 类型: {shape.Type}"); // 示例获取形状文本内容 string text = shape.Text; Debug.WriteLine($"文本内容: {text}"); }
方法2:通过组形状直接访问子形状集合
如果选中的对象是组形状,可以直接遍历组的Shapes属性获取所有子形状,无需依赖窗口选择:
var app = await FlipClass.GetVisioApplicationAsync(); var page = app.ActivePage; Visio.Selection selection = page.Application.ActiveWindow.Selection; if (selection.Count > 0) { Visio.Shape selectedShape = selection[1]; // 判断当前选中的是否为组形状 if (selectedShape.Type == (short)Visio.VisShapeTypes.visTypeGroup) { // 遍历组内所有子形状 foreach (Visio.Shape subShape in selectedShape.Shapes) { Debug.WriteLine($"子形状ID: {subShape.ID}, 名称: {subShape.Name}"); // 示例获取子形状高度属性 double height = subShape.CellsU["Height"].ResultIU; Debug.WriteLine($"子形状高度: {height}"); } } }
补充说明
- 若手动选中子形状但代码仍无法获取,需确认是否进入组编辑模式(双击组进入内部),此时
ActiveWindow.Selection才会直接返回子形状; - 访问形状属性时,建议使用
CellsU(通用单元格名称)而非Cells,避免因Visio语言版本差异导致的识别问题。
内容的提问来源于stack exchange,提问作者kkachi
相关产品推荐
相关产品推荐

