使用silverlight構建一個工作流設計器(七)(附最新源代碼及在線演示)
最新源代碼下載:http://shareidea.net/opensource.htm
最新版本在線演示:http://www.shareidea.net/workflow.htm
技術支持QQ群:85444465
本文系列索引:
本章包括兩部分內容,一個是在活動類上拖拽鼠標自動生成規則,另一個是網友的反饋,就是規則的端點不要在活動的中心,而要在活動的邊緣。
五 美化
5.9 使用鼠標拖拽自動生成規則
本章內容將給系統增加一個非常好的用戶體驗功能。之前我們增加一個設置一個規則需要以下幾個步驟:
l 點擊 增加規則 按鈕,添加一個規則到容器中。
l 拖動規則的起始部分,關聯的一個活動。
l 拖動規則的結尾部分,關聯到一個活動。
雖然只需要動動鼠標,已經很簡單了,但是還有沒有更簡單的呢?當然有,當鼠標在活動的中心區按下,并拖動鼠標,那么會自動生成一個臨時規則,這個規則的開始活動自動關聯到剛才點擊的活動,臨時規則的結尾點隨鼠標移動,這個過程用下圖來說明:

接下來來看一下為了完成以上功能需要做的工作有哪些。
1. 需要在活動上定出一個中心區域
在活動的xaml文件中增加一個圓形圖,以規則的中心為中心點,為了看的清楚,這個中心區域使用黃色填充,透明度設為0.3。
2. 監控中心區域的MouseLeftButtonDown事件
當鼠標在中心區域按下時,自動生成一個臨時的規則,并將這個規則的起始活動設為當前活動,把這個規則傳遞給第三步中的全局臨時規則,代碼如下:
1. 在容器類中設置一個全局的臨時規則對象
為了能夠在容器的層面捕獲這個自動生成的臨時規則,需要定義一個容器層面的規則引用。public Rule CurrentTemporaryRule { get; set; }
2. 監控容器的MouseMove和MouseLeftButtonUp
當鼠標在容器上移動時,如果有臨時的規則類,那么設置規則的結束位置,代碼如下:
當放開鼠標時,如果有臨時規則,那么檢查規則的結束位置是否關聯到活動,如果沒有關聯到任何活動,那么刪除這個臨時規則,如果有關聯到其他的活動,那么取消臨時定義。代碼如下:
通過以上的工作,我們就實現了本文開頭所說的部分。
5.10 設置規則的端點在活動的邊緣
這個設置可以用下圖來說明。
對于規則的短線設置在活動的邊緣,有兩種方式可以考慮。
l 一種是找到規則和活動的相交的點(Point),如上圖中紅色圓圈部分所示
l 另一個是規則出現的活動的固定的點上,如上圖藍色十字相交部分所示
對于第一種情況,目前還沒有找到一個好的方法來定位這個相交點。
對于第二種情況就稍微好處理一點了。
我們只要處理兩個活動的中心點的相對位置,就可以設置規則的端點的位置,如下圖所示

另外當規則為曲線時,程序還需要進一步判斷,下一章里面將作進一步改進。
本章內容到此結束,下章將繼續根據網友意見修改,謝謝關注:)
========================================================
比sharepoint更強大的表單功能,圖形化的流程設計,與asp.net完美結合,支持vs.net編程擴展
========================================================
浙公網安備 33010602011771號