MindFusion.Diagramming for WinForms是一个能帮助你创建工作流和进程图表的.NET控件;数据库实体关系图表;组织图表;对象层次和关系图表;图表和树。它是基于对象-图表框,表格和箭头类型,将其归类分派给其他并结合成复杂的结构。该控件提供超过预先定义的50多种图表框,如自定义设计样式和对图表框着色等。
MindFusion.Diagramming for WinForms最新版
Q:TreeLayout和OrthogonalLayout之间的区别是什么外你能告诉我OrthognalLayout如何对链接进行排序的代码吗/span>
A:你应该只为树图使用TreeLayout,否则尝试LayeredLayout或FlowchartLayout。
您可以根据图表类型有选择地应用不同的布局类。例如,检查当前图表是否为树(root的IncomingLinks.Count == 0,对于所有其他节点IncomingLinks.Count == 1),在这种情况下运行TreeLayout,否则为LayeredLayout。调用Arrange后,运行此方法以拉开相同的源和目标之间的链接:
代码:
void PullLinksApart(float padding){diagram.UpdateRuntimeIndices(); // find repeating linksvar repeatingLinks = new Dictionary();foreach (DiagramLink link in diagram.Links){int k1 = Math.Min(link.Origin.RuntimeIndex, link.Destination.RuntimeIndex);int k2 = Math.Max(link.Origin.RuntimeIndex, link.Destination.RuntimeIndex);int key = diagram.Items.Count * k1 + k2;if (!repeatingLinks.ContainsKey(key))repeatingLinks[key] = new List();repeatingLinks[key].Add(link);} // pull them apartforeach (KeyValuePair linkList in repeatingLinks){int c = 0, numLinks = linkList.Value.Count;if (numLinks < 2)continue;foreach (DiagramLink link in linkList.Value){for (int p = 0; p < link.ControlPoints.Count; ++p){PointF point = link.ControlPoints[p];point.X += padding * c - padding * (numLinks - 1) / 2;link.ControlPoints[p] = point;link.UpdateFromPoints();}c++;}}}
对于带有圆角链接的布局,您可以使用此处显示的方法。
代码:
private void diagram_LinkCreated(object sender, LinkEventArgs e){DiagramLinkCollection commonLinks = GetCommonLinks(e.Link.Origin, e.Link.Destination); PointF pt1 = e.Link.ControlPoints[0];PointF pt2 = e.Link.ControlPoints[e.Link.ControlPoints.Count - 1]; if (commonLinks.Count > 1){for (int c = 0; c < commonLinks.Count; ++c){DiagramLink link = commonLinks[c];link.Style = LinkStyle.Bezier;link.SegmentCount = 1; PointF cp1 = new PointF(pt1.X + 1 * (pt2.X - pt1.X) / 3, pt1.Y + 1 * (pt2.Y - pt1.Y) / 3);PointF cp2 = new PointF(pt1.X + 2 * (pt2.X - pt1.X) / 3, pt1.Y + 2 * (pt2.Y - pt1.Y) / 3); float angle = 0, radius = 0;CarteseanToPolar(pt1, pt2, ref angle, ref radius); int pairOffset = (c / 2 + 1) * 5;if (commonLinks.Count % 2 == 0){PolarToCartesean(cp1, c % 2 == 0 nbsp;angle - 90 : angle + 90, pairOffset, ref cp1);PolarToCartesean(cp2, c % 2 == 0 nbsp;angle - 90 : angle + 90, pairOffset, ref cp2); if (link.ControlPoints[0] == pt1){link.ControlPoints[1] = cp1;link.ControlPoints[2] = cp2;}else{link.ControlPoints[1] = cp2;link.ControlPoints[2] = cp1;} link.UpdateFromPoints();}}}} DiagramLinkCollection GetCommonLinks(DiagramNode node1, DiagramNode node2){DiagramLinkCollection commonLinks = new DiagramLinkCollection(); foreach (DiagramLink link in node1.OutgoingLinks)if (link.Destination == node2)commonLinks.Add(link); foreach (DiagramLink link in node1.IncomingLinks)if (link.Origin == node2)commonLinks.Add(link); return commonLinks;} void PolarToCartesean(PointF coordCenter, float a, float r, ref PointF dekart){if (r == 0){dekart = coordCenter;return;} dekart.X = (float)(coordCenter.X + Math.Cos(a * Math.PI / 180) * r);dekart.Y = (float)(coordCenter.Y - Math.Sin(a * Math.PI / 180) * r);} void CarteseanToPolar(PointF coordCenter, PointF dekart, ref float a, ref float r){if (coordCenter == dekart){a = 0;r = 0;return;} float dx = dekart.X - coordCenter.X;float dy = dekart.Y - coordCenter.Y;r = (float)(Math.Sqrt(Math.Pow(dx, 2) + Math.Pow(dy, 2))); a = (float)(Math.Atan(-dy / dx) * 180 / Math.PI);if (dx < 0) a += 180;}
您可以将LinkCreated代码复制到辅助方法,并为每对节点调用它,并在它们之间有多个链接。
问答持续更新中>>>
MindFusion.Diagramming for WinForms现已加入在线订购,点击此处查看价格~
想要购买MindFusion.Diagramming for WinForms正版授权的朋友欢迎咨询在线客服哦~

标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!