添加程式上的元素
WF 4.0提供了大量的程式元素,例如活動If、While、Assign、Sequence等等。下面舉一個時鐘的例子來說明程式元素的用法。開啟Workflow1.xaml檔案。
使用Variables(變數)
在WF 4.0中,你必須定義工作流程活動元素所用到的所有variable(變數)。你將需要兩個variables:一個用來指定在什麼時候報時,另一個用來需要報多少下鈴。點擊Variables按鈕,如果Variables的視窗如Figure1-3所示(在這種情況下是不能添加variable的),它的意思是variable沒有預設的範圍。
點擊設計器中的Sequence活動,這時Variables視窗就會變成如Figure1-7所示。
點擊Create Variable連結。輸入name為counter,選擇Variable type(變數類型)為Int32,Scope(範圍)這時預設為Sequence,你可以不去修改它,當然你也可以按你的需求去修改它。Scope為Sequence表示這個Variable可以在這個Sequence和Sequence的子活動中都有效。輸入Default(預設值)值為1。這時Variables視窗應該Figure1-8所示。
Properties(屬性)視窗同樣有這樣的功能(Figure1-9),你可以在Properties視窗或者在Variables視窗中輸入variable的屬性。
再次點擊Create Variable連結。這次你嘗試使用Properties視窗來輸入屬性。輸入name為numberBells,類型為Int32,保留Scope為Sequence。點擊Default屬性後面的省略符號,彈出Expression Editor對話方塊,Figure1-10所示。
提示:你可能注意到WF 4.0中用到很多expression(運算式)。很多的屬性都使用到運算式,但是,屬性的輸入框往往比較小,沒有足夠的空間來書寫複雜的運算式。為解決這個問題,VS2010提供了expression editor(運算式輸入框),我們只需要點擊屬性框後面的省略符號就能彈出運算式輸入框讓我們來輸入。運算式可以是variables(變數)、arguments(參數)和系統函數,就好像你在代碼中使用一樣。
在Default屬性的運算式輸入框中輸入運算式DateAndTime.Now.Hour。這會把現在的hour(小時數)賦值給numberBells變數。Variables視窗這時應該Figure1-11所示。
If活動
類DateAndTime的成員Hour是根據24小時返回小時數的。例如,2PM,它會返回14。因此你需要調整它,因為你需要在時鐘到達2的時候響鈴,而不是14。在代碼中,你可以這樣寫:
If (numberBells > 12)
numberBells -= 12;
但是,在WF 4.0中,你需要使用If和Assign活動來完成它。拖拉一個If活動到Hello活動的下面。這時設計器應該Figure1-12。
提示:注意到圖形中的紅色錯誤圓圈。如果你把滑鼠移到它們上面,它會提示你相關的錯誤。在If活動上的錯誤是你沒有指定條件屬性。在Sequence活動上的錯誤是它的一個或多個子活動有錯。
在屬性視窗,改變DisplayName為Adjust for PM。If活動由三個元素組成。Condition(條件)指定了需要驗證的邏輯,它應該是一個Boolean類型。Then元素是當Condition條件為TRUE時執行,而Else元素是Condition為Fault時執行。你不必同時指定Then和Else,只要其中一個有值就行。如果沒有定義活動,那麼也沒有活動會被執行。輸入Condition為numberBells>12。
Assign活動
拖拉一個Assign活動到Then容器。Assign活動允許你把一個值賦值給一個variable(變數)或者賦值給一個argument(參數)。這個活動圖表示如Figure1-13。
To和Value屬性都是接受一個運算式。你可以直接輸入一個運算式到屬性框中或者點擊省略符號,在運算式編輯框中輸入運算式。在To屬性中輸入numberBells。在Value中輸入numberBells-12。這時屬性框Figure1-14所示。
很多的活動都是容器活動,意思是他們可以包含其他的活動。If活動就是一個好例子。
While活動
現在你添加一個While活動來響鈴。在“Adjust for PM”的下面拖放一個While活動。修改DisplayName為Sound Bells。Figure1-15所示。
在While活動中,Body中的活動是在條件為真的時候執行,首先Condition(條件)被驗證,如果為真,則執行Body中的活動,活動會一直執行下去直到條件為假。
提示:DoWhile活動跟While活動類似,但DoWhile活動是先執行Body中的活動,然後才判斷Conditon中的條件,這樣就確保了Body中的活動至少會被執行一次。而While活動則是首先判斷Condition的條件,如果為假,則Body中的活動是不會被執行的。
在Condition中輸入counter<=numberBells。拖拉一個Sequence活動到Body容器中,設定Sequence的DisplayName為Sound Bell。這時圖示如Figure1-16。
Sequence活動
拖放三個活動到“Sound Bell”Sequence中。在這個練習中,我們不會真的去響鈴。而是我們輸出一行文本來代表響鈴。拖放一個WriteLine活動到“Sound Bell”活動中。在Text屬性中輸入
這會顯示當前counter的值。拖放一個Assign活動在WriteLine活動的下面。設定To屬性為counter,Value屬性為counter+1。用來不斷遞增counter。
Delay活動
最後,拖放一個Delay活動在Assign活動的下面。Delay活動可以讓工作流程在一段指定的時間內停止。Delay的屬性只有Duration,它指定了需要停止多久。這需要指定為一個TimeSpan類。輸入一下代碼:
現在的圖示應該為Figure1-17所示。
更多的裝飾
點擊在“Sound Bells”While活動右上方的收縮按鈕。工作流程的圖形會變成Figure1-18所示。
拖放一個WriteLine活動到“Sound Bells”活動的下面。修改DisplayName為DisplayTime;在Text屬性中輸入一下運算式:
拖拉一個If活動在“Display Time”的下面,設定DisplayName為Greeting。在Condition屬性中輸入:
在Then和Else容器中分別拖放一個WriteLine。在Then容器中的WriteLine的text為“Good Evening”;在Else容器中的WriteLine中的Text輸入“Good Day”。“Greeting”活動應該Figure1-19所示。
運行程式
點擊F5運行程式。根據時間的不同,啟動並執行結果會與下面的類似: