使用silverlight構建一個工作流程設計工具(七)(附最新原始碼及線上示範)

來源:互聯網
上載者:User
 

最新原始碼下載: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         另一個是規則出現的活動的固定的點上,如藍色十字相交部分所示

 

對於第一種情況,目前還沒有找到一個好的方法來定位這個相交點。 

對於第二種情況就稍微好處理一點了。

 

我們只要處理兩個活動的中心點的相對位置, 就可以設定規則的端點的位置,如所示

另外當規則為曲線時,程式還需要進一步判斷,下一章裡面將作進一步改進。

本章內容到此結束,下章將繼續根據網友意見修改,謝謝關註:)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.