最新原始碼下載:http://shareidea.net/opensource.htm
最新版本線上示範:http://www.shareidea.net/workflow.htm
支援人員QQ群:85444465
本文系列索引:
使用silverlight構建一個工作流程設計工具(一)
使用silverlight構建一個工作流程設計工具(二)
使用silverlight構建一個工作流程設計工具(三)
使用silverlight構建一個工作流程設計工具(四)
使用silverlight構建一個工作流程設計工具(五)
使用silverlight構建一個工作流程設計工具(六)
使用silverlight構建一個工作流程設計工具(七)
使用silverlight構建一個工作流程設計工具(八)
使用silverlight構建一個工作流程設計工具(九)
使用silverlight構建一個工作流程設計工具(十)
使用silverlight構建一個工作流程設計工具(十一)
本章包括兩部分內容,一個是在活動類上拖拽滑鼠自動建置規則,另一個是網友的反饋,就是規則的端點不要在活動的中心,而要在活動的邊緣。
五 美化5.9 使用滑鼠拖拽自動建置規則
本章內容將給系統增加一個非常好的使用者體驗功能。之前我們增加一個設定一個規則需要以下幾個步驟:
l 點擊 增加規則 按鈕,添加一個規則到容器中。
l 拖動規則的起始部分,關聯的一個活動。
l 拖動規則的結尾部分,關聯到一個活動。
雖然只需要動動滑鼠,已經很簡單了,但是還有沒有更簡單的呢? 當然有,當滑鼠在活動的中心區按下,並拖動滑鼠,那麼會自動產生一個臨時規則,這個規則的開始活動自動關聯到剛才點擊的活動,臨時規則的結尾點隨滑鼠移動,這個過程用來說明:
接下來來看一下為了完成以上功能需要做的工作有哪些。
1. 需要在活動上定出一個中心地區
在活動的xaml檔案中增加一個圓形圖,以規則的中心為中心點,為了看的清楚,這個中心地區使用黃色填充,透明度設為0.3。
2. 監控中心地區的MouseLeftButtonDown事件
當滑鼠在中心地區按下時,自動產生一個臨時的規則,並將這個規則的起始活動設為當前活動,把這個規則傳遞給第三步中的全域臨時規則,代碼如下:
Code
if (_container.CurrentTemporaryRule == null)
{
_container.CurrentTemporaryRule = new Rule(_container);
_container.CurrentTemporaryRule.IsTemporaryRule = true;
_container.AddRule(_container.CurrentTemporaryRule);
_container.CurrentTemporaryRule.SetBeginActivity(this);
_container.CurrentTemporaryRule.EndPointPosition = _container.CurrentTemporaryRule.BeginPointPosition;
_container.CurrentTemporaryRule.ZIndex = _container.NextMaxIndex;
}
1. 在容器類中設定一個全域的臨時規則對象
為了能夠在容器的層面捕獲這個自動產生的臨時規則,需要定義一個容器層面的規則引用。public Rule CurrentTemporaryRule { get; set; }
2. 監控容器的MouseMove和MouseLeftButtonUp
當滑鼠在容器上移動時,如果有臨時的規則類,那麼設定規則的結束位置,代碼如下 :
Code
private void Container_MouseMove(object sender, MouseEventArgs e)
{
if (CurrentTemporaryRule != null)
{
CurrentTemporaryRule.CaptureMouse();
CurrentTemporaryRule.EndPointPosition = e.GetPosition(CurrentTemporaryRule);
}
}
當放開滑鼠時,如果有臨時規則,那麼檢查規則的結束位置是否關聯到活動,如果沒有關聯到任何活動,那麼刪除這個臨時規則, 如果有關聯到其他的活動,那麼取消臨時定義。代碼如下:
Code
private void Container_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (CurrentTemporaryRule != null)
{
CurrentTemporaryRule.SimulateRulePointMouseLeftButtonUpEvent(RuleMoveType.End, CurrentTemporaryRule, e);
if (CurrentTemporaryRule.EndActivity == null)
{
this.RemoveRule(CurrentTemporaryRule);
}
else
{
CurrentTemporaryRule.IsTemporaryRule = false;
}
CurrentTemporaryRule.ReleaseMouseCapture();
CurrentTemporaryRule = null;
}
}
通過以上的工作,我們就實現了本文開頭所說的部分。
5.10 設定規則的端點在活動的邊緣
這個設定可以用來說明。
對於規則的短線設定在活動的邊緣,有兩種方式可以考慮。
l 一種是找到規則和活動的相交的點(Point),如中紅色圓圈部分所示
l 另一個是規則出現的活動的固定的點上,如藍色十字相交部分所示
對於第一種情況,目前還沒有找到一個好的方法來定位這個相交點。
對於第二種情況就稍微好處理一點了。
我們只要處理兩個活動的中心點的相對位置, 就可以設定規則的端點的位置,如所示
另外當規則為曲線時,程式還需要進一步判斷,下一章裡面將作進一步改進。
本章內容到此結束,下章將繼續根據網友意見修改,謝謝關註:)