翻譯|其它|編輯:吳園園|2019-09-11 11:24:55.320|閱讀 293 次
概述:MindFusion.Diagramming for WinForms是一款能夠幫助你輕松創建流程圖和示意圖的.NET控件,可以自定義設計樣式和圖表框顏色。本文整理了用戶常見的TreeLayout / OrthogonalLayout中的鏈接問題,希望對您有所幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
MindFusion.Diagramming for WinForms是一個能幫助你創建工作流和進程圖表的.NET控件;數據庫實體關系圖表;組織圖表;對象層次和關系圖表;圖表和樹。它是基于對象-圖表框,表格和箭頭類型,將其歸類分派給其他并結合成復雜的結構。該控件提供超過預先定義的50多種圖表框,如自定義設計樣式和對圖表框著色等。
點擊下載MindFusion.Diagramming for WinForms最新版
Q:TreeLayout和OrthogonalLayout之間的區別是什么?另外你能告訴我OrthognalLayout如何對鏈接進行排序的代碼嗎?
A:你應該只為樹圖使用TreeLayout,否則嘗試LayeredLayout或FlowchartLayout。
您可以根據圖表類型有選擇地應用不同的布局類。例如,檢查當前圖表是否為樹(root的IncomingLinks.Count == 0,對于所有其他節點IncomingLinks.Count == 1),在這種情況下運行TreeLayout,否則為LayeredLayout。調用Arrange后,運行此方法以拉開相同的源和目標之間的鏈接:
代碼:
void PullLinksApart(float padding)
{
diagram.UpdateRuntimeIndices();
// find repeating links
var 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 apart
foreach (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 ? angle - 90 : angle + 90, pairOffset, ref cp1);
PolarToCartesean(cp2, c % 2 == 0 ? 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正版授權的朋友歡迎哦~
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自: