|
這兩天遇到一個(gè)問(wèn)題,項(xiàng)目中需要在silverlight中使用連接圖的方式來(lái)顯示任務(wù)之間的關(guān)系,總體有父子和平行兩種,昨天在改同事的代碼,一直出問(wèn)題,索性晚上寫了一下實(shí)現(xiàn)方法。
需求
有一個(gè)List對(duì)象中存了若干個(gè)Task,這些Task對(duì)象通過(guò)ParentID屬性進(jìn)行關(guān)聯(lián),現(xiàn)在要求將這個(gè)List中的任務(wù)使用圖的方式形成如父子關(guān)系和平行關(guān)系的圖示例如下圖:
實(shí)現(xiàn)方法思考
剛開始接到這個(gè)任務(wù)我就想著遞歸應(yīng)該可以搞定了,但是仔細(xì)考慮才發(fā)現(xiàn)每個(gè)任務(wù)的子任務(wù)需要在一定區(qū)域內(nèi)才行,需要計(jì)算子級(jí)和子級(jí)之間的距離,如果使用遞歸,例如上圖的元素“12”的位置就沒(méi)有辦法很好確定了。
我決定將途中的節(jié)點(diǎn)抽象為一個(gè)類,這個(gè)類至少應(yīng)該含有上邊界top,左邊屆left及節(jié)點(diǎn)的名稱等屬性,然后從這個(gè)List對(duì)象中構(gòu)造出每個(gè)節(jié)點(diǎn)的屬性。
實(shí)現(xiàn)步驟
1,首先我們?yōu)閳D模擬一個(gè)數(shù)據(jù)源,注意其中的任務(wù)是通過(guò)ParentID關(guān)聯(lián)的。

public MainPage()
{
InitializeComponent();
listTask = new List<Task>();
listTask.Add(new Task() { ID = 1, ParentID = 0, Name = "1" });
listTask.Add(new Task() { ID = 2, ParentID = 1, Name = "11" });
listTask.Add(new Task() { ID = 3, ParentID = 1, Name = "12" });
listTask.Add(new Task() { ID = 4, ParentID = 2, Name = "21" });
listTask.Add(new Task() { ID = 5, ParentID = 2, Name = "22" });
listTask.Add(new Task() { ID = 6, ParentID = 3, Name = "31" });
listTask.Add(new Task() { ID = 7, ParentID = 3, Name = "32" });
listTask.Add(new Task() { ID = 8, ParentID = 3, Name = "33" });
listTask.Add(new Task() { ID = 9, ParentID = 4, Name = "42" });
listTask.Add(new Task() { ID = 10, ParentID =4, Name = "42" });
listTask.Add(new Task() { ID = 11, ParentID =3, Name = "34" });
listTask.Add(new Task() { ID = 12, ParentID = 5, Name = "51" });
listTask.Add(new Task() { ID = 13, ParentID = 8, Name = "81" });
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
NET技術(shù):Silverlight中使用遞歸構(gòu)造關(guān)系圖,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。