public NExpandableShape() { // add a rectangle shape as base NRectangleShape rect = new NRectangleShape(new NRectangleF(0, 0, 75, 75)); rect.DestroyShapeElements(ShapeElementsMask.All); rect.Protection = new NAbilities(AbilitiesMask.Select | AbilitiesMask.InplaceEdit); Shapes.AddChild(rect); // add an expand collapse shape NExpandCollapseCheck check = new NExpandCollapseCheck(); check.Bounds = new NRectangleF(80, 0, 12, 12); check.Protection = new NAbilities(AbilitiesMask.Select | AbilitiesMask.InplaceEdit); check.ResizeInAggregate = ResizeInAggregate.RepositionOnly; Shapes.AddChild(check); // update the model bounds with the rectangle bounds UpdateModelBounds(rect.Transform.TransformBounds(rect.ModelBounds)); // initially it is expanded m_bExpanded = true; // by default the group has one dynamic port anchored to the rectangle CreateShapeElements(ShapeElementsMask.Ports); NDynamicPort port = new NDynamicPort(rect.UniqueId, ContentAlignment.MiddleCenter, DynamicPortGlueMode.GlueToContour); Ports.AddChild(port); Ports.DefaultInwardPortUniqueId = port.UniqueId; // by default the group has one rotated bounds port anchored to the rectangle CreateShapeElements(ShapeElementsMask.Labels); NRotatedBoundsLabel label = new NRotatedBoundsLabel("", rect.UniqueId, new Nevron.Diagram.NMargins(10)); Labels.AddChild(label); Labels.DefaultLabelUniqueId = label.UniqueId; }