專利名稱::用于設(shè)計(jì)工作流的可擴(kuò)展框架的制作方法
技術(shù)領(lǐng)域:
:本申請(qǐng)的實(shí)施例涉及工作流建模領(lǐng)域。更為具體地,本發(fā)明的實(shí)施例涉及組件化和可擴(kuò)展工作流模型。
背景技術(shù):
:現(xiàn)有系統(tǒng)試圖通過對(duì)商業(yè)問題建模而將商業(yè)問題映射到高級(jí)工作流。然而,真實(shí)世界的工作流在各方面都有所不同,這些方面諸如(a)執(zhí)行和建模的復(fù)雜性、(b)設(shè)計(jì)時(shí)對(duì)工作流的結(jié)構(gòu)的知識(shí)、(c)靜態(tài)定義或特別/動(dòng)態(tài)、(d)在其生命周期中各點(diǎn)創(chuàng)作和編輯該工作流的簡(jiǎn)易性、以及(e)與核心工作流過程的弱或強(qiáng)商業(yè)邏輯關(guān)聯(lián)?,F(xiàn)有模型無法容納所有這些因素。此外,大多數(shù)現(xiàn)有工作流模型是以基于語言的方法(例如,BPEL4WS、XLANG/S和WSFL)或基于應(yīng)用程序的方法為基礎(chǔ)的?;谡Z言的方法是具有一閉合的預(yù)定義構(gòu)造集的高級(jí)工作流語言,它幫助向用戶/程序員建模該工作流過程。工作流語言載有供該閉合構(gòu)造集使用的所有語義信息,以使用戶能夠構(gòu)建工作流模型。然而,語言無法由開發(fā)者來擴(kuò)展,且表示構(gòu)成該工作流模型的閉合的原語集。語言被綁定到由工作流系統(tǒng)銷售商發(fā)貨的語言編譯器。僅該工作流系統(tǒng)產(chǎn)品銷售商可通過在該產(chǎn)品的未來版本中用一新的構(gòu)造集擴(kuò)展該語言來擴(kuò)展該模型。這通常要求升級(jí)與該語言相關(guān)聯(lián)的編譯器。基于應(yīng)用程序的方法是這樣一種應(yīng)用程序,它在該應(yīng)用程序內(nèi)具有工作流能力以解決領(lǐng)域?qū)S脝栴}。這些應(yīng)用程序不是真正可擴(kuò)展的,也沒有可編程模型。采用現(xiàn)有方法,復(fù)雜性、預(yù)知、動(dòng)態(tài)工作流、創(chuàng)作簡(jiǎn)易性以及與商業(yè)邏輯和核心工作流的關(guān)聯(lián)強(qiáng)度等問題未被充分地解決。沒有可擴(kuò)展、可定制以及可重新主宿工作流設(shè)計(jì)器框架可用于構(gòu)建可視工作流設(shè)計(jì)器來對(duì)不同的工作流類別建?!,F(xiàn)有系統(tǒng)缺乏一種快速應(yīng)用程序開發(fā)(RAD)風(fēng)格工作流設(shè)計(jì)體驗(yàn),它允許用戶圖形地設(shè)計(jì)工作流過程,并以開發(fā)者選擇的編程語言來關(guān)聯(lián)商業(yè)邏輯。另外,沒有啟用了墨跡的工作流設(shè)計(jì)器。另外,現(xiàn)有系統(tǒng)無法提供用于執(zhí)行工作流的無縫特別或動(dòng)態(tài)編輯。工作流過程在本質(zhì)上是動(dòng)態(tài)且移動(dòng)的,且其形式不能在設(shè)計(jì)時(shí)完全預(yù)見。該工作流過程以結(jié)構(gòu)化方式起始,并最終在其執(zhí)行生命周期過程中發(fā)展和改變。需要一種允許工作流構(gòu)建者能夠在設(shè)計(jì)時(shí)創(chuàng)作各種類型的工作流模型,以及以無縫的方式對(duì)運(yùn)行的工作流做出特別或動(dòng)態(tài)改變的工作流創(chuàng)作框架。即使在部署了工作流過程之后且該工作流過程正在運(yùn)行,商業(yè)需求的變化通常迫使改變或編輯當(dāng)前運(yùn)行的工作流過程。需要一種提供工作流過程的運(yùn)行時(shí)創(chuàng)作的系統(tǒng)。另外,工作流過程處理跨越工作流過程模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問題。例如,盡管工作流過程的各部分被設(shè)計(jì)成參與長(zhǎng)期運(yùn)行的事務(wù),然而同一過程的其它部分被設(shè)計(jì)成用于并發(fā)執(zhí)行。同一工作流過程的另外一些部分要求跟蹤,而其它部分處理商業(yè)或應(yīng)用程序級(jí)例外。需要向工作流過程的一個(gè)或多個(gè)部分應(yīng)用特定的行為。某些工作流建模方法是不實(shí)用的,因?yàn)樗鼈冃枰麄€(gè)商業(yè)過程的基于流的完整描述,包括所有例外以及人類干預(yù)。這些方法中的一些提供了當(dāng)出現(xiàn)例外時(shí)的附加功能,而其它方法獨(dú)占地采用基于約束的方法而非基于流的方法來對(duì)商業(yè)過程建?!,F(xiàn)有系統(tǒng)實(shí)現(xiàn)基于流或基于約束的方法中的任一種。這些系統(tǒng)該不靈活,以致于無法對(duì)許多常見商業(yè)情況進(jìn)行建模。因此,需要一種組件化且可擴(kuò)展的工作流模型來解決這些和其它缺點(diǎn)的一個(gè)或多個(gè)。
發(fā)明內(nèi)容本發(fā)明的實(shí)施例提供了一種用于構(gòu)建組件化工作流模型的可擴(kuò)展框架。具體地,工作流過程中的每一步驟具有描述工作流步驟的設(shè)計(jì)時(shí)方面、編譯時(shí)方面以及運(yùn)行時(shí)方面的相關(guān)聯(lián)組件模型。此外,任何開發(fā)者可通過創(chuàng)作這些組件來擴(kuò)展核心工作流模型。本發(fā)明包括一工作流引擎,它足夠靈活和強(qiáng)大來協(xié)調(diào)各種工作流的執(zhí)行,包括高度形式的機(jī)器到機(jī)器過程、基于約束的特別人類工作流、以及具有基于流和基于約束的方法的混合的工作流。該工作流引擎準(zhǔn)許對(duì)執(zhí)行工作流的激活、執(zhí)行、查詢和控制能力。例如,本發(fā)明準(zhǔn)許對(duì)執(zhí)行工作流的特別和動(dòng)態(tài)改變。該工作流引擎可以在包括服務(wù)器和客戶機(jī)環(huán)境兩者的各種宿主環(huán)境中重新主宿或嵌入。每一特定宿主環(huán)境將工作流引擎與一組服務(wù)提供者相結(jié)合。服務(wù)提供者的總能力確定了可在該特定宿主環(huán)境中執(zhí)行的工作流的種類。本發(fā)明的其它實(shí)施例提供了一種用于序列化工作流模型的聲明性格式,諸如可擴(kuò)展配合(orchestration)標(biāo)記語言(XOML)。該聲明性格式使用戶能夠通過編寫一組組件來擴(kuò)展工作流模型。對(duì)應(yīng)于工作流過程的各步驟的語義被封裝在活動(dòng)確認(rèn)器組件中,該組件在編譯時(shí)確認(rèn)并實(shí)施給定組件的語義。本發(fā)明的聲明性格式的實(shí)施例還能夠進(jìn)行數(shù)據(jù)聲明以及與工作流模型的各元素的數(shù)據(jù)相關(guān)。該聲明性格式支持?jǐn)?shù)據(jù)通過工作流的變換。例如,該格式聲明性地表示外部數(shù)據(jù)源,如數(shù)據(jù)庫或文件、代碼片斷以及工作流模型內(nèi)的商業(yè)規(guī)則。本發(fā)明的一個(gè)實(shí)施例提供了一種構(gòu)建圖形/可視工作流設(shè)計(jì)器的可擴(kuò)展、可定址以及可重新主宿的工作流設(shè)計(jì)器框架,以對(duì)不同類別的工作流建模。本發(fā)明的另一實(shí)施例支持快速應(yīng)用程序開發(fā)風(fēng)格的工作流設(shè)計(jì)體驗(yàn),以允許用戶圖形地設(shè)計(jì)工作流過程,并以任何編程語言來關(guān)聯(lián)商業(yè)邏輯。本發(fā)明的實(shí)施例也使用筆和圖形輸入板技術(shù)提供了墨跡支持。本發(fā)明提供了一種自由形式的繪圖表面,其中,由用戶繪制的工作流被轉(zhuǎn)移到內(nèi)部表示。本發(fā)明支持通過在現(xiàn)有繪圖表面上的墨跡編輯(例如,添加/刪除活動(dòng))以及現(xiàn)有工作流的墨跡注釋(例如,書寫表面上的注解、建議或提醒等手繪物)對(duì)工作流的創(chuàng)建和修改。本發(fā)明的其它一些實(shí)施例提供了用于以聲明性方式捕捉橫切行為并將行為應(yīng)用于工作流模型的選中部分的組件。本發(fā)明的其它實(shí)施例在與其相關(guān)聯(lián)的行為的上下文中執(zhí)行工作流模型的選中部分。本發(fā)明的實(shí)施例提供了處理工作流模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問題的框架、可重新使用組件和語言。根據(jù)本發(fā)明的一個(gè)方面,一種方法在具有顯示器和用戶界面選擇設(shè)備的計(jì)算機(jī)系統(tǒng)中對(duì)工作流建模。該工作流包括活動(dòng),并且,該工作流程對(duì)商業(yè)過程建模。該方法包括在顯示器上顯示多個(gè)活動(dòng)。該方法也包括經(jīng)由用戶界面選擇設(shè)備從用戶接收對(duì)活動(dòng)的選擇。該方法也包括在顯示器上顯示所接收的活動(dòng)選擇。該方法也包括經(jīng)由用戶界面選擇設(shè)備從用戶接收結(jié)構(gòu)信息。該方法也包括根據(jù)所接收的結(jié)構(gòu)信息在顯示器上排列所顯示的活動(dòng)選擇,以創(chuàng)建工作流。根據(jù)本發(fā)明的另一方面,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于在具有顯示器和用戶界面選擇設(shè)備的計(jì)算機(jī)系統(tǒng)中對(duì)工作流建模的計(jì)算機(jī)可執(zhí)行組件。該工作流包括活動(dòng),并且該工作流對(duì)商業(yè)過程建模。組件包括用于在顯示器上顯示多個(gè)活動(dòng)的呈現(xiàn)組件。組件也包括用于經(jīng)由用戶界面選擇設(shè)備從用戶接收對(duì)由呈現(xiàn)組件顯示的活動(dòng)的選擇的接口組件。呈現(xiàn)組件還在顯示器上顯示接口組件所接收的活動(dòng)選擇。接口組件還經(jīng)由用戶界面選擇設(shè)備來從用戶接收結(jié)構(gòu)信息。組件也包括用于根據(jù)所接收的結(jié)構(gòu)信息在顯示器上排列活動(dòng)選擇,以創(chuàng)建工作流的設(shè)計(jì)器組件。根據(jù)本發(fā)明的又一方面,一種系統(tǒng)對(duì)工作流建模。該工作流包括活動(dòng),并且該工作流對(duì)商業(yè)過程建模。系統(tǒng)包括用于存儲(chǔ)多個(gè)活動(dòng)的存儲(chǔ)區(qū)域。該系統(tǒng)也包括用于顯示存儲(chǔ)在存儲(chǔ)區(qū)域內(nèi)的多個(gè)活動(dòng)的顯示區(qū)域。該系統(tǒng)也包括被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令的處理器,這些計(jì)算機(jī)可執(zhí)行指令用于從用戶接收對(duì)活動(dòng)的選擇、在顯示區(qū)域內(nèi)顯示所接收的活動(dòng)選擇、從用戶接收結(jié)構(gòu)信息、以及根據(jù)所接收的結(jié)構(gòu)信息在顯示區(qū)域內(nèi)排列所顯示的活動(dòng)選擇,以創(chuàng)建工作流。作為選擇,本發(fā)明可以包括各種其它方法和裝置。其它特點(diǎn)將部分地一目了然,并且將在下文中部分地指出。圖1是包含任務(wù)和控制流合成活動(dòng)的示例性工作流。圖2示出了示例性活動(dòng)繼承樹。圖3示出了示例性組件模型。圖4是示出與本發(fā)明的用戶交互以創(chuàng)建工作流的框圖。圖5示出了示例性的用墨水寫的工作流。圖6示出了從圖5中用墨水寫的工作流轉(zhuǎn)換而來的工作流。圖7是示出與本發(fā)明的用戶交互以創(chuàng)建工作流的流程圖。圖8是示出觸摸屏實(shí)施例中用墨水寫的工作流的識(shí)別的流程圖。圖9是用于創(chuàng)作依賴于工作流規(guī)范的向?qū)У墓ぷ髁鞯母呒?jí)應(yīng)用程序用戶界面。圖10示出了示例性工作流設(shè)計(jì)器。圖11示出了包括后面是發(fā)送活動(dòng)的接收活動(dòng)的配合程序。圖12是示出可以在其中實(shí)現(xiàn)本發(fā)明的合適的計(jì)算系統(tǒng)環(huán)境的一個(gè)例子的框圖。附錄A描述示范活動(dòng)。附錄B描述可視設(shè)計(jì)器和相關(guān)聯(lián)的活動(dòng)設(shè)計(jì)器。貫穿這些附圖,對(duì)應(yīng)的參考標(biāo)號(hào)表示對(duì)應(yīng)的部分。具體實(shí)施例方式本發(fā)明的實(shí)施例對(duì)表示諸如商業(yè)過程等過程的工作流進(jìn)行建模。商業(yè)過程是導(dǎo)致可預(yù)測(cè)和可重復(fù)結(jié)果的依賴性和有序的任務(wù)、活動(dòng)等。包括組織的操作過程、機(jī)構(gòu)的工作知識(shí)以及信息資源,商業(yè)過程被設(shè)計(jì)成以有效且及時(shí)的方式滿足所定義的商業(yè)目標(biāo)。在一個(gè)有效的環(huán)境中,過程的功能性組件可被容易地標(biāo)識(shí)、適應(yīng)和部署來解決不斷改變的企業(yè)需求。工作流是與商業(yè)過程中的任務(wù)交互的最終用戶的體驗(yàn)。任務(wù)被建模為活動(dòng)、組件等,其每一個(gè)表示由個(gè)人或機(jī)器執(zhí)行的工作單元。在一個(gè)實(shí)施例中,向用戶呈現(xiàn)多個(gè)活動(dòng)。用戶選擇并組織活動(dòng)來創(chuàng)建工作流。執(zhí)行所創(chuàng)建的工作流以對(duì)商業(yè)過程建模。參考圖1,示例性工作流100包含任務(wù)和控制流合成活動(dòng)。在一個(gè)示例中,配合引擎工作流模型支持不同類別工作流的建模、創(chuàng)作和執(zhí)行。示例包括按照出現(xiàn)在有序序列中或作為一組異步事件出現(xiàn)的一組結(jié)構(gòu)化步驟對(duì)給定問題建模。該配合引擎協(xié)調(diào)進(jìn)度表的執(zhí)行。進(jìn)度表是以樹形結(jié)構(gòu)分層排列的一組經(jīng)組織的活動(dòng)。執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見的共享數(shù)據(jù)由一作用域提供。每一活動(dòng)表示封裝工作流過程中步驟元數(shù)據(jù)的組件?;顒?dòng)是工作流模型中的基本執(zhí)行單元,且具有相關(guān)聯(lián)的屬性、句柄、約束和事件。每一活動(dòng)可以由任何編程語言中的用戶代碼來配置。例如,用戶代碼可表示以公用語言運(yùn)行時(shí)環(huán)境(CLR)語言書寫的商業(yè)或應(yīng)用程序邏輯或規(guī)則。每一活動(dòng)支持對(duì)用戶代碼中的執(zhí)行的預(yù)截聽(pre-interception)掛鉤和后截聽(post-interception)掛鉤。每一活動(dòng)具有相關(guān)聯(lián)的運(yùn)行時(shí)執(zhí)行語義和行為(例如,狀態(tài)管理、事務(wù)、事件處理和異常處理)?;顒?dòng)可與其它活動(dòng)共享狀態(tài)。活動(dòng)可以是原語活動(dòng)或被組合成合成活動(dòng)。原語或基本活動(dòng)沒有子結(jié)構(gòu)(例如,子活動(dòng)),并由此是樹結(jié)構(gòu)中的葉節(jié)點(diǎn)。合成活動(dòng)包含子結(jié)構(gòu)(例如,它是一個(gè)或多個(gè)子活動(dòng)的父節(jié)點(diǎn))。在一個(gè)實(shí)施例中,活動(dòng)有三種類型簡(jiǎn)單活動(dòng)、容器活動(dòng)和根活動(dòng)。在本實(shí)施例中,在模型中有一個(gè)根活動(dòng),且根活動(dòng)中沒有或有任何數(shù)量的簡(jiǎn)單活動(dòng)或容器活動(dòng)。容器活動(dòng)可包括簡(jiǎn)單或容器活動(dòng)。整個(gè)工作流過程可用作構(gòu)建更高階工作流過程的活動(dòng)。此外,活動(dòng)可以是可中斷或不可中斷的。不可中斷合成活動(dòng)不包括可中斷活動(dòng)。不可中斷活動(dòng)缺少可導(dǎo)致活動(dòng)阻斷的服務(wù)。配合引擎提供一組示例性的活動(dòng)。參考圖2,一活動(dòng)繼承樹示出了若干示例性活動(dòng)。圖2列出的示例性活動(dòng)在附錄A中詳細(xì)描述。另外,任何用戶可編寫一個(gè)或多個(gè)活動(dòng)來擴(kuò)展工作流模型。例如,用戶可為特定的商業(yè)問題、領(lǐng)域、工作流標(biāo)準(zhǔn)(例如,商業(yè)過程執(zhí)行語言)或目標(biāo)平臺(tái)編寫活動(dòng)。配合引擎可向用戶提供一組豐富的服務(wù)來編寫活動(dòng),該組服務(wù)包括,例如分析代碼、類型分解和類型系統(tǒng)的服務(wù)、用于序列化和呈現(xiàn)的服務(wù)。在一個(gè)實(shí)施例中,每一活動(dòng)具有至少三個(gè)部分元數(shù)據(jù)、實(shí)例數(shù)據(jù)和執(zhí)行邏輯。活動(dòng)的元數(shù)據(jù)定義了可被配置的數(shù)據(jù)屬性。例如,某些活動(dòng)可共享在活動(dòng)抽象基類中定義的一組公用元數(shù)據(jù)。每一活動(dòng)依照其需求通過擴(kuò)展該類來聲明其自己的附加元數(shù)據(jù)屬性。元數(shù)據(jù)屬性的值由該活動(dòng)跨配置該活動(dòng)的進(jìn)度表的實(shí)例的所有實(shí)例共享。例如,如果用戶創(chuàng)建進(jìn)度表A,并向其添加一發(fā)送活動(dòng),則該發(fā)送活動(dòng)被給予標(biāo)識(shí)信息(例如,“001”)作為其元數(shù)據(jù)的一部分。添加到該進(jìn)度表的第二發(fā)送活動(dòng)將接收其自己的唯一標(biāo)識(shí)信息(例如,“002”)。一旦創(chuàng)建和執(zhí)行了進(jìn)度表A的多個(gè)實(shí)例,則發(fā)送“001”的所有實(shí)例將共享元數(shù)據(jù)值。相反,活動(dòng)的實(shí)例元數(shù)據(jù)定義了一組對(duì)運(yùn)行進(jìn)度表實(shí)例中的活動(dòng)實(shí)例專用的數(shù)據(jù)。例如,延遲活動(dòng)可提供其實(shí)例數(shù)據(jù)上的只讀屬性,該實(shí)例數(shù)據(jù)是標(biāo)識(shí)延遲活動(dòng)的超時(shí)值的日期和時(shí)間值。一旦延遲活動(dòng)開始執(zhí)行,該值即可用,且它對(duì)延遲活動(dòng)的每一單個(gè)實(shí)例很可能是不同的。通常參考進(jìn)度表的實(shí)例,尤其是活動(dòng)和任務(wù)的實(shí)例,而不用“實(shí)例”來限定參考。合成活動(dòng)具有其子活動(dòng)組作為另一元素。子活動(dòng)在一個(gè)實(shí)施例中被認(rèn)為是元數(shù)據(jù)。配合引擎模型明確地準(zhǔn)許在運(yùn)行時(shí)在進(jìn)度表的實(shí)例中操縱該元數(shù)據(jù)。向作為執(zhí)行進(jìn)度表實(shí)例的一個(gè)部分的合成活動(dòng)添加新的子活動(dòng),使得僅該進(jìn)度表實(shí)例的元數(shù)據(jù)(活動(dòng)樹)被影響是可能的。接下來參考圖3,每一活動(dòng)具有一組相關(guān)聯(lián)的組件,它們形成了該活動(dòng)的組件模型。該組相關(guān)聯(lián)的組件包括活動(dòng)執(zhí)行器、活動(dòng)設(shè)計(jì)器、活動(dòng)序列化器、活動(dòng)確認(rèn)器(例如,語義檢查器)、以及活動(dòng)代碼生成器?;顒?dòng)執(zhí)行器是實(shí)現(xiàn)該活動(dòng)的執(zhí)行語義的無狀態(tài)(stateless)組件?;顒?dòng)執(zhí)行器與活動(dòng)的元數(shù)據(jù)一起工作來實(shí)現(xiàn)該活動(dòng)。代碼調(diào)度器擔(dān)當(dāng)活動(dòng)執(zhí)行器的服務(wù)提供者以向活動(dòng)執(zhí)行器提供服務(wù)?;顒?dòng)設(shè)計(jì)器可視地顯示活動(dòng)的設(shè)計(jì)時(shí)可視表示?;顒?dòng)設(shè)計(jì)器是設(shè)計(jì)器分層結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),并且可以加主題或加皮膚?;顒?dòng)設(shè)計(jì)器主宿在設(shè)計(jì)環(huán)境中(例如,應(yīng)用程序),并通過服務(wù)與宿主設(shè)計(jì)環(huán)境交互?;顒?dòng)確認(rèn)器在編譯時(shí)以及運(yùn)行時(shí)實(shí)施活動(dòng)語義?;顒?dòng)確認(rèn)器在工作流模型的上下文中操作,并使用由該環(huán)境提供的服務(wù)(例如,編譯器、設(shè)計(jì)器或運(yùn)行時(shí)環(huán)境)。確認(rèn)在工作流生命周期中的各個(gè)點(diǎn)發(fā)生。結(jié)構(gòu)依從性檢查在創(chuàng)建工作流的序列化表示時(shí)、編譯時(shí)或響應(yīng)于用戶請(qǐng)求而做出。語義檢查可以在運(yùn)行時(shí)比在編譯時(shí)執(zhí)行的檢查更強(qiáng)大,以確保諸如運(yùn)行實(shí)例的活動(dòng)樹中活動(dòng)的添加和替換等運(yùn)行時(shí)操作的安全性。本發(fā)明評(píng)估與每一活動(dòng)相關(guān)聯(lián)的語義,以找出例如與預(yù)定接口要求的一致性和依從性?;顒?dòng)序列化器是序列化活動(dòng)元數(shù)據(jù)的組件?;顒?dòng)序列化器從各種模型/格式序列化器中調(diào)用。整個(gè)工作流模型是基于一可擴(kuò)展模式被序列化成聲明性標(biāo)記語言的,它可以按需進(jìn)一步被轉(zhuǎn)換成其它工作流語言。在一個(gè)實(shí)施例中,活動(dòng)的組件模型作為數(shù)據(jù)結(jié)構(gòu)儲(chǔ)存在計(jì)算機(jī)可讀介質(zhì)上。在該數(shù)據(jù)結(jié)構(gòu)中,活動(dòng)設(shè)計(jì)器由儲(chǔ)存用于可視地表示該活動(dòng)的數(shù)據(jù)的圖像字段(例如,圖標(biāo))表示。另外,一個(gè)或多個(gè)創(chuàng)作時(shí)字段儲(chǔ)存定義與活動(dòng)相關(guān)聯(lián)的屬性、方法和事件的元數(shù)據(jù)?;顒?dòng)序列化器由儲(chǔ)存用于將儲(chǔ)存在創(chuàng)作時(shí)字段中的元數(shù)據(jù)傳送到活動(dòng)的聲明性表示的數(shù)據(jù)的序列化器字段表示。活動(dòng)生成器由儲(chǔ)存與儲(chǔ)存在創(chuàng)作時(shí)字段中的元數(shù)據(jù)相關(guān)聯(lián)的軟件代碼的商業(yè)邏輯字段來表示?;顒?dòng)執(zhí)行器由儲(chǔ)存用于執(zhí)行儲(chǔ)存在商業(yè)邏輯字段中的軟件代碼的數(shù)據(jù)的執(zhí)行器字段表示。作用域和進(jìn)度表執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見的共享數(shù)據(jù)由作用域來提供。作用域是核心活動(dòng)之一。作用域是用于將變量和長(zhǎng)期運(yùn)行服務(wù)與事務(wù)語義、出錯(cuò)處理語義、補(bǔ)償、事件處理程序和數(shù)據(jù)狀態(tài)管理集合在一起的統(tǒng)一構(gòu)造。作用域可具有相關(guān)聯(lián)的異常和事件處理程序。在一個(gè)實(shí)施例中,作用域可以是事務(wù)的、原子的、長(zhǎng)期運(yùn)行的或同步的。在對(duì)用戶變量的沖突讀一寫或?qū)懸粚懺L問的情況下,向用戶提供并發(fā)控制。作用域也是事務(wù)邊界、異常處理邊界以及補(bǔ)償邊界。由于作用域可以在進(jìn)度表內(nèi)嵌套,因此用不同作用域內(nèi)相同的名字(即使作用域是嵌套的)來聲明變量、消息、通道和相關(guān)集而沒有名字沖突也是可能的。在進(jìn)度表內(nèi)嵌套的作用域只能在該進(jìn)度表的上下文內(nèi)執(zhí)行。進(jìn)度表可以被編譯為應(yīng)用程序(例如,獨(dú)立的可執(zhí)行實(shí)體)或庫(例如,用于從其它進(jìn)度表調(diào)用)。被編譯為庫的每一進(jìn)度表有效地構(gòu)成了可從其它進(jìn)度表內(nèi)調(diào)用的新活動(dòng)類型。進(jìn)度表的元數(shù)據(jù)包括參數(shù)的聲明。一旦開發(fā)了進(jìn)度表,可執(zhí)行所開發(fā)的進(jìn)度表的實(shí)例。激活和控制進(jìn)度表實(shí)例的過程是由其中嵌入了配合引擎的宿主環(huán)境所決定的。配合引擎提供了可用于測(cè)試進(jìn)度表的不提供必要服務(wù)的“簡(jiǎn)單宿主”。另外,配合引擎提供了一激活服務(wù)來促進(jìn)同樣由引擎和外部應(yīng)用程序用于與服務(wù)環(huán)境(即,宿主)交互的“服務(wù)提供者”模型(例如,應(yīng)用程序編程接口)的標(biāo)準(zhǔn)化。激活服務(wù)創(chuàng)建了特定進(jìn)度表類型的進(jìn)度表實(shí)例,并可任選地傳遞參數(shù)。進(jìn)度表實(shí)例本質(zhì)上是運(yùn)行進(jìn)度表實(shí)例的代理,并包括唯一地標(biāo)識(shí)該實(shí)例的標(biāo)識(shí)符、對(duì)進(jìn)度表的元數(shù)據(jù)(活動(dòng)樹)的引用、以及掛起、恢復(fù)和終止實(shí)例的方法。激活服務(wù)也支持基于給定的進(jìn)度表實(shí)例標(biāo)識(shí)符找出進(jìn)度表實(shí)例。代碼分離(code-beside)作用域活動(dòng)可具有包括用于該作用域活動(dòng)的商業(yè)邏輯的相關(guān)聯(lián)的代碼分離類。由于進(jìn)度表本身是作用域,因此進(jìn)度表也可具有代碼分離的類。在進(jìn)度表內(nèi)嵌套的作用域也可具有其自己的代碼分離類。在作用域內(nèi)嵌套的活動(dòng)共享該作用域的代碼分離類,它擔(dān)當(dāng)其共享數(shù)據(jù)的狀態(tài)和商業(yè)邏輯的容器。例如,代碼活動(dòng)的元數(shù)據(jù)包括對(duì)具有代碼分離中的特定簽名的方法的引用。在另一實(shí)例中,發(fā)送活動(dòng)的元數(shù)據(jù)包括對(duì)特定簽名的代碼分離方法的可任選引用加上對(duì)消息聲明和通道聲明的強(qiáng)制引用。代碼分離的示例性使用包括變量、消息、通道和相關(guān)集的聲明;出/入/引用參數(shù)的聲明;附加自定義屬性的聲明;要發(fā)送的消息的準(zhǔn)備;已接收消息的處理;以返回布爾值的代碼表達(dá)的規(guī)則的實(shí)現(xiàn);本地定義的變量的操縱;讀活動(dòng)元數(shù)據(jù)和實(shí)例數(shù)據(jù);寫活動(dòng)實(shí)例數(shù)據(jù)(例如,設(shè)置將要執(zhí)行的活動(dòng)的屬性);引發(fā)事件;拋出異常;枚舉和導(dǎo)航運(yùn)行進(jìn)度表實(shí)例的活動(dòng)樹中的活動(dòng)的分層結(jié)構(gòu),包括跨嵌套的作用域和進(jìn)度表調(diào)用邊界;向運(yùn)行進(jìn)度表實(shí)例內(nèi)的合成活動(dòng)添加新活動(dòng);改變與運(yùn)行進(jìn)度表實(shí)例內(nèi)的活動(dòng)相關(guān)聯(lián)的聲明性規(guī)則;以及獲取對(duì)其它運(yùn)行進(jìn)度表實(shí)例的引用和對(duì)其的操縱。用于設(shè)計(jì)工作流的用戶界面參考圖4,一框圖示出了與本發(fā)明的用戶交互以創(chuàng)建工作流。用戶402與顯示器404(例如,顯示設(shè)備、或應(yīng)用程序的執(zhí)行環(huán)境內(nèi)的顯示區(qū)域)和用戶界面選擇設(shè)備406交互,以便經(jīng)由計(jì)算機(jī)可執(zhí)行組件來設(shè)計(jì)工作流。用于對(duì)該工作流建模的計(jì)算機(jī)可執(zhí)行組件被存儲(chǔ)在諸如計(jì)算機(jī)可讀介質(zhì)410等一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)上,并且包括呈現(xiàn)組件412、接口組件414、設(shè)計(jì)器組件416和確認(rèn)組件418。呈現(xiàn)組件412將多個(gè)活動(dòng)顯示在顯示器404上。接口組件414經(jīng)由用戶界面選擇設(shè)備406從用戶402接收對(duì)呈現(xiàn)組件412所顯示的活動(dòng)的選擇。呈現(xiàn)組件412還在顯示器404上顯示接口組件414所接收的活動(dòng)選擇。接口組件414還經(jīng)由用戶界面選擇設(shè)備406從用戶402接收結(jié)構(gòu)信息。設(shè)計(jì)器組件416根據(jù)所接收的結(jié)構(gòu)信息在顯示器404上排列活動(dòng)選擇,以創(chuàng)建工作流。確認(rèn)組件418評(píng)估語義與預(yù)定義接口要求的一致性。在一個(gè)實(shí)施例中,本發(fā)明是啟用墨跡的,并且包括用于從用戶402接收工作流的手繪表示的觸摸屏436。本發(fā)明將該手繪工作流轉(zhuǎn)換成工作流。圖5中示出示例性的用墨水寫的工作流。在用戶402選擇“自動(dòng)識(shí)別”之后,該工作流被轉(zhuǎn)換成圖6中所示的工作流。該啟用墨跡的實(shí)施例允許用戶402構(gòu)建與圖形輸入板計(jì)算設(shè)備兼容的工作流設(shè)計(jì)器。該啟用墨跡的工作流設(shè)計(jì)器允許用戶402在整個(gè)工作流創(chuàng)建過程中使用筆、定點(diǎn)設(shè)備或類似物(例如,從最初的草圖階段到包括對(duì)所跟蹤數(shù)據(jù)的分析的執(zhí)行階段和執(zhí)行后階段)。在這一實(shí)施例中,這些計(jì)算機(jī)可執(zhí)行組件還包括選項(xiàng)板組件422、識(shí)別器組件420、皮膚組件424和工作流組件426。選項(xiàng)板組件422定義多個(gè)選項(xiàng)板元素。所定義的多個(gè)選項(xiàng)板元素中的每一個(gè)對(duì)應(yīng)于至少一個(gè)活動(dòng)。接口組件414經(jīng)由觸摸屏436從用戶402接收多個(gè)圖形元素。排列所接收的多個(gè)圖形元素,以創(chuàng)建工作流。識(shí)別器組件420將接口組件414所接收的多個(gè)圖形元素中的每一個(gè)與選項(xiàng)板組件422所定義的選項(xiàng)板元素之一相關(guān)聯(lián),并且排列這些相關(guān)聯(lián)的選項(xiàng)板元素,以便在觸摸屏436上顯示該工作流。皮膚組件424將所接收的用戶定義主題應(yīng)用于顯示在觸摸屏436上的工作流。工作流組件426根據(jù)識(shí)別器組件420所排列的相關(guān)聯(lián)的選項(xiàng)板元素,來創(chuàng)建工作流。具體地,用戶402在圖形輸入板計(jì)算設(shè)備上用圖形地草擬該過程。本發(fā)明支持用于與過程和過程構(gòu)造(例如,并行、決策、循環(huán)以及事件/激活條件)交互的各種過程定義游動(dòng)路線(swimlane)。然后,本發(fā)明的軟件要么在草擬期間匆忙地、要么在用戶402已完成草圖之后將圖形草圖轉(zhuǎn)換成過程定義。然后,可以在顯示器404上用具有標(biāo)準(zhǔn)符號(hào)和元素的工作流來替換圖形草圖。用戶402能夠編輯所顯示的工作流、為工作流添加或刪除注釋(例如,單或多用戶情形)、以及糾正所顯示的工作流元素。具體地,通過在現(xiàn)有工作流上繪制或書寫注釋、注解和/或提示,用戶402可以進(jìn)行注解;并且,本發(fā)明存儲(chǔ)墨跡以及該工作流表示,以及墨跡相對(duì)于周圍形狀的位置。另外,通過繪制額外的草圖、通過繪制被解釋為編輯的標(biāo)準(zhǔn)手勢(shì)(例如,刪除、復(fù)制、移動(dòng))、或通過插入特殊的活動(dòng)類型,用戶402可以修改該過程定義。本發(fā)明也支持繪圖與過程定義之間的往返。例如,當(dāng)繪圖改變時(shí),更新過程定義;反之亦然。本發(fā)明存儲(chǔ)該繪圖以及所創(chuàng)建的過程定義。在一個(gè)實(shí)施例中,這可以用來在用戶繪圖上顯示過程執(zhí)行進(jìn)度。例如,商業(yè)分析家繪制工作流,并將它提供給開發(fā)者,開發(fā)者將該工作流轉(zhuǎn)換成過程定義、對(duì)它進(jìn)行編譯、并開始過程執(zhí)行。商業(yè)分析家要么在過程定義視圖中、要么在繪圖窗格中觀察執(zhí)行過程。本發(fā)明也允許用戶402經(jīng)由繪制和/或書寫來與運(yùn)行的(例如,執(zhí)行的)工作流交互。例如,用戶402可以在管理視圖中控制運(yùn)行過程的執(zhí)行(例如,開始/停止/終止);或者通過用筆、定點(diǎn)設(shè)備或類似物來書寫輸入,可以與工作流進(jìn)行通信。由本發(fā)明識(shí)別的手勢(shì)(例如,刪除或插入某些形狀)不限于預(yù)定義的手勢(shì)集。即,用戶402可以創(chuàng)建供本發(fā)明軟件識(shí)別的自定義手勢(shì)。在一個(gè)實(shí)施例中,本發(fā)明被實(shí)施為以商業(yè)分析家為目標(biāo)的獨(dú)立應(yīng)用程序。在另一個(gè)實(shí)施例中,本發(fā)明被實(shí)施為用于應(yīng)用程序中的工作流設(shè)計(jì)器。即,圖4中所示的組件在應(yīng)用程序的執(zhí)行環(huán)境內(nèi)執(zhí)行。在另一個(gè)實(shí)施例中,處理器408被配置成執(zhí)行用于對(duì)工作流建模的計(jì)算機(jī)可執(zhí)行指令,并訪問存儲(chǔ)區(qū)域428。存儲(chǔ)區(qū)域428存儲(chǔ)多個(gè)活動(dòng)430。處理器408執(zhí)行這些計(jì)算機(jī)可執(zhí)行指令,以便從用戶402接收對(duì)活動(dòng)430的選擇、在顯示器404上顯示所接收的活動(dòng)430的選擇、從用戶402接收結(jié)構(gòu)信息、以及根據(jù)所接收的結(jié)構(gòu)信息在顯示器404上排列所顯示的活動(dòng)430的選擇,以創(chuàng)建工作流。在包括觸摸屏436或其他顯示器(例如,定點(diǎn)設(shè)備或其類似物可接受的顯示器404)的實(shí)施例中,存儲(chǔ)區(qū)域428還存儲(chǔ)經(jīng)由顯示器404和可任選的定點(diǎn)設(shè)備從用戶402接收的多個(gè)圖形元素432。這些圖形元素432由用戶402排列,以表示工作流。存儲(chǔ)區(qū)域428還存儲(chǔ)多個(gè)選項(xiàng)板元素434,其每一個(gè)對(duì)應(yīng)于活動(dòng)430中的至少一個(gè)。在這一實(shí)施例中,處理器408還被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令,用于將存儲(chǔ)在存儲(chǔ)區(qū)域428內(nèi)的圖形元素432的每一個(gè)映射到多個(gè)選項(xiàng)板元素434之一、根據(jù)所映射的選項(xiàng)板元素434創(chuàng)建工作流、以及在顯示器404上顯示該工作流。圖4中所示的元素構(gòu)成用于顯示多個(gè)活動(dòng)(例如,活動(dòng)430)的示例性裝置、用于接收對(duì)活動(dòng)的選擇的示例性裝置、用于從用戶402接收結(jié)構(gòu)信息的示例性裝置、以及用于根據(jù)所接收的結(jié)構(gòu)信息來排列所顯示的活動(dòng)選擇以便創(chuàng)建工作流的示例性裝置。另外,定點(diǎn)設(shè)備構(gòu)成用于經(jīng)由數(shù)字筆或觸針等傳達(dá)信息的示例性裝置,顯示器404構(gòu)成用于從數(shù)字筆或觸針等接收輸入的示例性裝置,并且,處理器408構(gòu)成用于從用戶402接收多個(gè)圖形元素(例如,圖形元素432)并根據(jù)其來創(chuàng)建工作流的示例性裝置。再次參考圖4,接下來參考圖7,一流程圖示出了用于對(duì)工作流建模的方法。該方法包括在702處,在顯示器404上顯示多個(gè)活動(dòng)430;在704處,經(jīng)由用戶界面選擇設(shè)備406從用戶402接收對(duì)活動(dòng)430的選擇;在706處,在顯示器404上顯示所接收的活動(dòng)430的選擇;在708處,經(jīng)由用戶界面選擇設(shè)備406從用戶402接收結(jié)構(gòu)信息;以及,在710處,根據(jù)所接收的結(jié)構(gòu)信息在顯示器404上排列所顯示的活動(dòng)430的選擇,以創(chuàng)建工作流。在一個(gè)實(shí)施例中,顯示多個(gè)活動(dòng)430包括在顯示器404上的選項(xiàng)板顯示區(qū)域和/或工作空間顯示區(qū)域內(nèi)顯示多個(gè)活動(dòng)430。接下來參考圖8,在觸摸屏實(shí)施例中,該方法還包括在802處,定義多個(gè)選項(xiàng)板元素,其中,所定義的多個(gè)選項(xiàng)板元素中的每一個(gè)對(duì)應(yīng)于活動(dòng)中的至少一個(gè);在804處,經(jīng)由觸摸屏從用戶接收多個(gè)圖形元素,其中,排列所接收的多個(gè)圖形元素,以創(chuàng)建工作流;在806處,通過將所接收的多個(gè)圖形元素中的每一個(gè)與所定義的選項(xiàng)板元素之一相關(guān)聯(lián),來識(shí)別所接收的多個(gè)圖形元素中的每一個(gè);以及,在808處,在觸摸屏上排列這些相關(guān)聯(lián)的選項(xiàng)板元素,以顯示該工作流。在一個(gè)實(shí)施例中,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)(例如,計(jì)算機(jī)可讀介質(zhì)410、428)具有用于執(zhí)行圖7和圖8中所示的方法的計(jì)算機(jī)可執(zhí)行指令。工作流模板(stencil)工作流模板(例如,工作流樣板或活動(dòng)包)包括根活動(dòng)和一組活動(dòng)。模板可以是域或宿主專用的。模型的示例包括結(jié)構(gòu)化的工作流模板、人類工作流模板以及非結(jié)構(gòu)化的工作流模板。某些模板可以作為一組活動(dòng)是“閉合的”,包括被設(shè)計(jì)成可能在特定的宿主環(huán)境中共同工作的一個(gè)或多個(gè)根。其它模板可能是“開放”到各種程度的。模板定義了其可擴(kuò)展性點(diǎn)。例如,開發(fā)者編寫CustomRoot(自定義根)和新的抽象CustomActivity(自定義活動(dòng)),并聲明包是CustomRoot加上從CustomActivity導(dǎo)出的任何活動(dòng)。示例性BPEL或XLANG/S模板包括具有以下特征的根活動(dòng)狀態(tài)管理和事務(wù)中的參與具有相關(guān)聯(lián)的事件和異常處理程序、支持合約第一模型、可被分析、并具有定義良好的激活和終止行為。示例性模板還包括一組消息通信專用活動(dòng)(例如,Send(發(fā)送)和Receive(接收)及其變體),以及諸如Scope(作用域)、Loop(循環(huán))、Condition(條件)、Listen(監(jiān)聽)和Throw(拋出)等其它結(jié)構(gòu)化活動(dòng)。一個(gè)示例性Halifax模板包括具有以下特征的根活動(dòng)隱含狀態(tài)管理、相關(guān)聯(lián)的異常處理程序(0-n)、支持基于事件的模型、具有良好定義的激活行為、以及具有未定義的終止。根活動(dòng)包含0-n個(gè)EventDriven(事件驅(qū)動(dòng))活動(dòng)。每一EventDriven活動(dòng)表示一個(gè)Halifax活動(dòng)。每一EventDriven活動(dòng)具有相關(guān)聯(lián)的狀態(tài)管理協(xié)議并在原子作用域內(nèi)執(zhí)行。設(shè)計(jì)器框架(用戶界而)配合引擎提供了用于以WYSWYG方式設(shè)計(jì)各種類別的工作流模型的框架。例如,參考圖9,一種用于創(chuàng)作工作流的高級(jí)應(yīng)用程序用戶界面依賴于工作流規(guī)范的向?qū)?。該框架包括使開發(fā)者能夠編寫可視工作流設(shè)計(jì)器的一組服務(wù)和行為。這些服務(wù)提供了呈現(xiàn)工作流過程的有效方式、支持用于繪制工作流的墨跡/圖形輸入板、以及支持諸如撤消/回復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換等設(shè)計(jì)器操作、書簽、裝飾、用于確認(rèn)錯(cuò)誤的智能標(biāo)簽、用于活動(dòng)的有效拖動(dòng)目標(biāo)指示符、自動(dòng)布局、視圖分頁、導(dǎo)航標(biāo)記器、拖動(dòng)指示符、具有頁眉/頁腳的打印和預(yù)覽等等。通過這一用戶界面,可構(gòu)造包含任務(wù)和控制流合成活動(dòng)(例如,順序、并行和條件)的簡(jiǎn)單工作流。對(duì)規(guī)則規(guī)范(例如,條件分支邏輯、while循環(huán)邏輯)或數(shù)據(jù)流規(guī)范(例如,任務(wù)A的輸出是任務(wù)B的輸入)不要求代碼輸入(或依賴于現(xiàn)有的已編譯代碼)。進(jìn)度表的序列化表示(包括規(guī)則和數(shù)據(jù)流)是自包含的,且在不需要代碼分離的某些情形中完成。使用本發(fā)明的設(shè)計(jì)器框架,本發(fā)明的配合引擎包括一種快速應(yīng)用程序開發(fā)(RAD)風(fēng)格的可視工作流設(shè)計(jì)器,它支持以可視方式將軟件代碼與工作流模型相關(guān)聯(lián)。工作流中的每一活動(dòng)具有相關(guān)聯(lián)的活動(dòng)設(shè)計(jì)器。每一活動(dòng)設(shè)計(jì)器是按照框架服務(wù)來編寫的。本發(fā)明的框架也包含一可視設(shè)計(jì)器模型。該可視設(shè)計(jì)器模型包括通過該工作流模型中的關(guān)系彼此鏈接的一組活動(dòng)設(shè)計(jì)器。圖10示出了一個(gè)示例性工作流設(shè)計(jì)器。可視設(shè)計(jì)器和活動(dòng)設(shè)計(jì)器在附錄B中詳細(xì)描述。本發(fā)明包括將代碼與工作流模型相關(guān)聯(lián)的各種模式,包括“代碼分離”、“代碼嵌入”和允許用戶代碼實(shí)時(shí)在工作流模型中往返的“僅代碼”。本發(fā)明也提供了當(dāng)用戶在構(gòu)建工作流時(shí)的實(shí)時(shí)語義錯(cuò)誤。配合引擎設(shè)計(jì)器允許用戶通過使用其它所創(chuàng)建的進(jìn)度表來遞歸地組成更高階進(jìn)度表并使用它們。進(jìn)度表的內(nèi)聯(lián)擴(kuò)充允許用戶內(nèi)聯(lián)地查看進(jìn)度表內(nèi)容并剪切或復(fù)制內(nèi)容。為允許進(jìn)度表的內(nèi)聯(lián)擴(kuò)充以及使進(jìn)度表只讀,創(chuàng)建用于內(nèi)聯(lián)進(jìn)度表的單獨(dú)設(shè)計(jì)表面和設(shè)計(jì)器宿主。此外,合成進(jìn)度表設(shè)計(jì)器具有其自己的分層結(jié)構(gòu)。所調(diào)用的進(jìn)度表在設(shè)計(jì)器由用戶擴(kuò)充時(shí)被加載和顯示。在一個(gè)實(shí)施例中,當(dāng)活動(dòng)被放到或復(fù)制到設(shè)計(jì)器表面上時(shí),層疊設(shè)計(jì)器。一屬性將調(diào)用活動(dòng)設(shè)計(jì)器與主宿的進(jìn)度表的根設(shè)計(jì)器鏈接。以下函數(shù)防止向設(shè)計(jì)器添加或移除活動(dòng)。internalstaticboolAreAllComponentsInWritableContext(ICollectioncomponents)internalstaticboolIsContextReadOnly(IServiceProviderserviceProvider)這些函數(shù)由基礎(chǔ)結(jié)構(gòu)調(diào)用以檢查其中插入活動(dòng)的上下文是否為可寫的。對(duì)于主宿的設(shè)計(jì)器,這些函數(shù)返回假。另外,防止屬性被修改。其它函數(shù)從適當(dāng)?shù)慕M件中取出活動(dòng)設(shè)計(jì)器internalstaticServiceDesignerGetSafeRootDesigner(IServiceProviderserviceProvider)internalstaticICompositeActivityDesignerGetSafeParentDesigner(objectobj)internalstaticIActivityDesignerGetSafeDesigner(objectobj)在一個(gè)示例中,用戶創(chuàng)建進(jìn)度表并將其編譯為活動(dòng)。在成功地編譯之后,該進(jìn)度表出現(xiàn)在工具箱中。用戶打開或創(chuàng)建其中需要所編譯的進(jìn)度表的進(jìn)度表。用戶從工具箱中拖放所編譯的進(jìn)度表。在設(shè)計(jì)表面上示出層疊的進(jìn)度表設(shè)計(jì)器。當(dāng)用戶希望查看放下的所編譯的進(jìn)度表的內(nèi)容時(shí),用戶擴(kuò)充進(jìn)度表設(shè)計(jì)器以用只讀的狀態(tài)示出內(nèi)聯(lián)的所調(diào)用的進(jìn)度表的內(nèi)容。所調(diào)用的進(jìn)度表的內(nèi)聯(lián)使用戶能夠查看所調(diào)用的進(jìn)度表,而無需在不同的進(jìn)度表設(shè)計(jì)器之間切換。該特征對(duì)于通過重復(fù)使用現(xiàn)有進(jìn)度表來組成更高階進(jìn)度表的開發(fā)者而言是有用的。對(duì)使用主題/皮膚的設(shè)計(jì)器框架的定制的支持使用設(shè)計(jì)器框架編寫的工作流設(shè)計(jì)器可使用工作流主題來定制。這些可以是聲明性地描述設(shè)計(jì)器的各方面的可擴(kuò)展標(biāo)記語言(XML)文件。工作流設(shè)計(jì)器提供伙伴擴(kuò)展活動(dòng)的向?qū)еС?。工作流設(shè)計(jì)器支持的示例性用戶界面特征包括,但不限于,撤消/恢復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換、書簽、裝飾、用于確認(rèn)錯(cuò)誤的智能標(biāo)簽、用于活動(dòng)的有效拖動(dòng)目標(biāo)指示符、自動(dòng)布局、視圖分頁、導(dǎo)航標(biāo)記器、拖動(dòng)指示符、具有頁眉/頁腳的打印和預(yù)覽、以及文檔大綱綜合。工作流設(shè)計(jì)器支持自定義的設(shè)計(jì)器主題/皮膚來允許使用XML元數(shù)據(jù)定制設(shè)計(jì)器的外觀和感覺。例如,工作流設(shè)計(jì)器從用戶接收定制信息。工作流設(shè)計(jì)器支持后臺(tái)編譯。在一個(gè)實(shí)施例中,提供了在設(shè)計(jì)進(jìn)度表時(shí)用于確認(rèn)錯(cuò)誤的智能標(biāo)簽和智能動(dòng)作。工作流設(shè)計(jì)器可主宿在任何容器中(例如,應(yīng)用程序、外殼等)。一個(gè)示例性配合引擎程序包括接收活動(dòng)以及其后跟隨的發(fā)送活動(dòng)。該過程接收消息并將其發(fā)送出去。用戶創(chuàng)建名為“HelloWorld”的項(xiàng)目,并向該項(xiàng)目添加配合項(xiàng)。用戶然后將作用域活動(dòng)拖放至設(shè)計(jì)表面。下一步,用戶將接收活動(dòng)以及其后的發(fā)送活動(dòng)放到該作用域上。圖11示出了設(shè)計(jì)器中的所得工作流1100。每一活動(dòng)設(shè)計(jì)器提供了對(duì)象模型上的用戶界面表示。開發(fā)者能夠直接對(duì)對(duì)象模型編程,并設(shè)置活動(dòng)上的屬性或使用該設(shè)計(jì)器。配合引擎設(shè)計(jì)器允許開發(fā)者從工具箱中選擇活動(dòng)并將其拖到設(shè)計(jì)器表面上。如果活動(dòng)已被放置到進(jìn)度表中并需要移動(dòng),則開發(fā)者能夠選擇它(通過點(diǎn)擊它)并將其拖至它需要去往的進(jìn)度表區(qū)域。如果開發(fā)者按住ctrl鍵并同時(shí)進(jìn)行拖放,則做出所選中活動(dòng)的副本。積極放置提供了可能的拖動(dòng)點(diǎn)(目標(biāo))作為設(shè)計(jì)表面上的可視指示器。自動(dòng)滾動(dòng)也參與在拖放的上下文中。當(dāng)處理大型進(jìn)度表時(shí),到當(dāng)前不在視見區(qū)中的設(shè)計(jì)器區(qū)域的導(dǎo)航可通過將該活動(dòng)拖向要放置的進(jìn)度表區(qū)域來訪問。拖放可跨統(tǒng)一項(xiàng)目中的進(jìn)度表以及跨統(tǒng)一解決方案中的其它項(xiàng)目中的進(jìn)度表得到支持。在活動(dòng)被放置到設(shè)計(jì)表面上之后,開發(fā)者配置該活動(dòng)。每一活動(dòng)具有一組屬性,開發(fā)者配置該屬性以使進(jìn)度表有效。這些屬性可在屬性瀏覽器中編輯。每一活動(dòng)控制什么屬性在屬性瀏覽器中是可查看的。為幫助開發(fā)者配置各活動(dòng),設(shè)計(jì)器提供了各種對(duì)話框或“子設(shè)計(jì)器”。對(duì)活動(dòng)的各屬性調(diào)用每一對(duì)話框。配合引擎能夠定制工具箱中呈現(xiàn)的活動(dòng)。當(dāng)開發(fā)者創(chuàng)建自定義活動(dòng)或進(jìn)度表時(shí),最終的結(jié)果是程序集。使用對(duì)話框,開發(fā)者能夠?yàn)g覽程序集位置并選擇該程序集以使其作為配合引擎活動(dòng)出現(xiàn)。或者,開發(fā)者可將程序集放置在配合引擎安裝路徑中,且它作為配合引擎活動(dòng)呈現(xiàn)。應(yīng)用程序編程接口(API)在另一實(shí)施例中,本發(fā)明提供了用于執(zhí)行各種工作流操作的應(yīng)用程序編程接口(API)。硬件、軟件以及一個(gè)或多個(gè)應(yīng)用程序編程接口(API)構(gòu)成了用于創(chuàng)作工作流的示例性裝置、用于選擇一個(gè)或多個(gè)活動(dòng)來創(chuàng)建工作流的示例性裝置、用于序列化工作流的示例性裝置、用于定制工作流的可視外觀的示例性裝置、用于確認(rèn)工作流的示例性裝置、用于編譯工作流的示例性裝置、以及用于將類型與工作流中的每一活動(dòng)相關(guān)聯(lián)的示例性裝置。活動(dòng)執(zhí)行框架由于有進(jìn)度表和作用域的例外,因此引擎將活動(dòng)視為抽象的實(shí)體,并僅協(xié)調(diào)活動(dòng)的執(zhí)行而不知道任何特定活動(dòng)的具體數(shù)據(jù)或語義。在一個(gè)實(shí)施例中,四個(gè)實(shí)體在活動(dòng)的執(zhí)行期間交互活動(dòng)本身、正在執(zhí)行的活動(dòng)的父活動(dòng)、包含正在執(zhí)行的活動(dòng)的作用域、以及配合引擎。每一實(shí)體具有不同的功能。如果活動(dòng)的執(zhí)行方法返回而沒有向其活動(dòng)協(xié)調(diào)器發(fā)信號(hào)通知完成,則該活動(dòng)被認(rèn)為是在邏輯等待狀態(tài)中。這一活動(dòng)可由配合引擎取消,或繼續(xù)(例如,一旦它所等待的項(xiàng)或事件變得可用或發(fā)生,且由引擎向該活動(dòng)通知這一情況)。某些從未進(jìn)入邏輯等待狀態(tài)的活動(dòng)可能從不被取消。示例包括發(fā)送活動(dòng)和代碼活動(dòng),因?yàn)樗鼈儾恍枰獙?duì)外部事件或預(yù)定的需求就可執(zhí)行。一旦交出了線程(即,一旦其執(zhí)行方法由配合引擎調(diào)用),則這些活動(dòng)將做工作直到完成。從不給配合引擎取消它們的機(jī)會(huì),因?yàn)樗鼈儾环祷鼐€程直到它們發(fā)信號(hào)通知完成。配合引擎運(yùn)行時(shí)環(huán)境使用規(guī)則來觸發(fā)在其上執(zhí)行配合引擎活動(dòng)的事件。配合引擎設(shè)計(jì)器向用戶提供了在運(yùn)行時(shí)關(guān)聯(lián)要評(píng)估的規(guī)則來觸發(fā)事件的能力。配合引擎設(shè)計(jì)器通過提供可擴(kuò)展性體系結(jié)構(gòu)使用戶能夠使用不同類型的規(guī)則技術(shù)。該設(shè)計(jì)器對(duì)于所使用的規(guī)則技術(shù)的類型是不可知的。在一個(gè)實(shí)施例中,設(shè)計(jì)器支持布爾表達(dá)式處理程序,作為將規(guī)則與活動(dòng)相關(guān)聯(lián)的一種方式。這意味著在用戶代碼文件中,用戶編寫返回真或假值的方法,基于該方法觸發(fā)規(guī)則。當(dāng)前有多種可用于評(píng)估規(guī)則的技術(shù),包括信息代理(InfoAgent)和商業(yè)規(guī)則引擎(BRE)。為實(shí)現(xiàn)這一目標(biāo),設(shè)計(jì)器包括使規(guī)則技術(shù)開發(fā)者能夠在設(shè)計(jì)器中主宿自定義用戶界面的可擴(kuò)展性體系結(jié)構(gòu)。該設(shè)計(jì)器提供了一種自定義用戶界面編寫者以代碼語句集合的形式序列化規(guī)則的方法。該設(shè)計(jì)器在用戶代碼文件中發(fā)放布爾處理程序,并向其插入代碼語句集合。配合引擎包括可由規(guī)則編寫者使用的默認(rèn)用戶界面。規(guī)則技術(shù)提供者通過創(chuàng)建自定義規(guī)則聲明、編寫與自定義規(guī)則聲明相關(guān)聯(lián)的用戶界面類型編輯器、創(chuàng)建自定義用戶界面來主宿規(guī)則用戶界面、以及在保存時(shí)生成代碼語句來向配合引擎設(shè)計(jì)器添加規(guī)則。在一個(gè)示例中,用戶選擇要向其附加規(guī)則的活動(dòng)設(shè)計(jì)器、在屬性瀏覽器中定位規(guī)則屬性并在下拉框中選擇“RuleExpressionHandler(規(guī)則表達(dá)式處理程序)”(它使得“Statements(語句)”屬性出現(xiàn)在用戶界面的Rule(規(guī)則)屬性下方)、在“Statements”屬性中指定用戶代碼方法名、調(diào)用用戶界面類型編輯器來調(diào)用主宿規(guī)則專用用戶界面的對(duì)話框、以及在對(duì)話框中通過創(chuàng)建新的謂詞行并將它們組合在一起來定義規(guī)則。用戶界面在用戶代碼文件中發(fā)放方法。方法名將與由用戶在屬性瀏覽器中指定的名稱相同。等效于創(chuàng)建規(guī)則的代碼語句將被插入到該規(guī)則的用戶代碼方法中。執(zhí)行期間的消息通信在運(yùn)行工作流中,發(fā)送到進(jìn)度表的消息是預(yù)期供特定進(jìn)度表實(shí)例使用的。例如,購買定單#123的發(fā)票必須被發(fā)送回發(fā)起(例如,發(fā)送出)該購買定單的同一進(jìn)度表實(shí)例。為將入站消息與適當(dāng)?shù)倪M(jìn)度表實(shí)例相匹配,消息和進(jìn)度表實(shí)例共享一相關(guān)集。該相關(guān)集可以是單值相關(guān)集,這意味著消息中的標(biāo)識(shí)符字段與由進(jìn)度表實(shí)例持有的相同類型的標(biāo)識(shí)符進(jìn)行匹配。多屬性相關(guān)集也是可能的,且類似于數(shù)據(jù)庫表中的多列主要關(guān)鍵字。進(jìn)度表實(shí)例持有的相關(guān)集的值是在進(jìn)度表實(shí)例發(fā)送出消息時(shí)初始化的(例如,可從出棧定單的標(biāo)識(shí)符字段中取該值),或當(dāng)進(jìn)度表實(shí)例接收消息時(shí)初始化的。該相關(guān)集值然后是該進(jìn)度表實(shí)例狀態(tài)的一部分。當(dāng)隨后的入站消息到達(dá)時(shí),進(jìn)度表實(shí)例狀態(tài)中保持的相關(guān)集值與由預(yù)期類型的入站消息所持有的標(biāo)識(shí)符字段進(jìn)行匹配。當(dāng)找到匹配,則滿足該相關(guān)集,且該消息被傳遞到進(jìn)度表實(shí)例。盡管相關(guān)集的實(shí)現(xiàn)是由配合引擎和宿主環(huán)境所決定的,但是在一個(gè)實(shí)施例中,用戶聲明該相關(guān)集以使進(jìn)度表實(shí)例能夠正確工作。在另一實(shí)施例中,某些活動(dòng)(例如,SendRequest(發(fā)送請(qǐng)求)/ReceiveResponse(接收響應(yīng))活動(dòng)以及ReceiveRequest(接收請(qǐng)求)/SendReponse(發(fā)送響應(yīng))活動(dòng))與用戶無關(guān)地設(shè)置相關(guān)集。由發(fā)送和接收活動(dòng)執(zhí)行各種各樣的確認(rèn)檢查,以確保相關(guān)集是正確初始化和遵循的。執(zhí)行工作流的動(dòng)態(tài)編輯配合引擎提供了用于創(chuàng)作(以及隨后可視化和執(zhí)行)各種類型的工作流的框架。示例包括事件一條件一動(dòng)作(ECA)風(fēng)格的工作流或結(jié)構(gòu)化工作流或規(guī)則驅(qū)動(dòng)工作流。此外,不論是如何對(duì)工作流建模的,工作流都允許用戶在設(shè)計(jì)時(shí)或甚至在工作流過程正在運(yùn)行時(shí)以同一方式創(chuàng)作或編輯工作流,而無需重新編譯該工作流過程。該框架允許用戶以高保真度在運(yùn)行時(shí)和設(shè)計(jì)時(shí)表示之間進(jìn)行往返。特別(adhoc)改變是在運(yùn)行時(shí)對(duì)過程模型做出的改變。用戶可向運(yùn)行的實(shí)例要求其進(jìn)度表模型,并向該模型做出改變。例如,用戶可按批添加、移除或替換活動(dòng),然后提交或回退批處理的改變。在一個(gè)實(shí)施例中,模型是在更新之后確認(rèn)的。在本發(fā)明的許多工作流情形中,“設(shè)計(jì)時(shí)創(chuàng)作”和“運(yùn)行時(shí)執(zhí)行”之間的分隔存在模糊或甚至是消除。進(jìn)度表實(shí)例有效地與其它實(shí)例共享為那些實(shí)例的進(jìn)度表類型所定義的活動(dòng)類型(元數(shù)據(jù))樹。但是一旦開始執(zhí)行,任何進(jìn)度表實(shí)例可通過添加新活動(dòng)或操縱聲明性規(guī)則在進(jìn)行中改變。采取這一修改的進(jìn)度表實(shí)例并“保存為”新進(jìn)度表類型,或更一般地,僅從實(shí)例中恢復(fù)序列化的表示是可能的。即,運(yùn)行的進(jìn)度表實(shí)例可被序列化,然后將其帶入任何設(shè)計(jì)器(例如,創(chuàng)作環(huán)境)或運(yùn)行時(shí)可視化工具。此外,對(duì)于高級(jí)開發(fā)者而言,將進(jìn)度表完全作為軟件代碼來創(chuàng)作是可能的。為直接創(chuàng)作進(jìn)度表類型,開發(fā)者只需在該進(jìn)度表的代碼分離類的軟件代碼中包括稱為InitializeScheduleModel(初始化進(jìn)度表模型)的方法,然后用[ScheduleCreator](進(jìn)度表創(chuàng)建器)元屬性來標(biāo)記該方法。在一個(gè)實(shí)施例中,該靜態(tài)方法不采用任何參數(shù),并返回一Schedule(進(jìn)度表)對(duì)象。沒有伴隨的序列化文件,盡管可從所創(chuàng)建的Schedule對(duì)象中恢復(fù)該進(jìn)度表的序列化表示。盡管這意味著可使用單個(gè)軟件代碼文件來開發(fā)進(jìn)度表,然而可能不在該文件上執(zhí)行確認(rèn)檢查。配合引擎編譯確保作為進(jìn)度表類型的基礎(chǔ)的活動(dòng)樹的結(jié)構(gòu)和語義有效性。在另一實(shí)施例中,編譯和確認(rèn)內(nèi)部地運(yùn)行,以產(chǎn)生所執(zhí)行的實(shí)際類型,而不要求任何代碼輸入。進(jìn)度表類型編譯變?yōu)橐环N非常容易的過程,因?yàn)闆]有從編譯時(shí)對(duì)象模型到運(yùn)行時(shí)對(duì)象模型的轉(zhuǎn)換。本質(zhì)上,編譯只需將進(jìn)度表的對(duì)象模型表示與代碼分離相組合以產(chǎn)生新類型。在一個(gè)實(shí)施例中,如果所編譯的代碼分離與對(duì)象模型中的活動(dòng)所需求的相匹配,對(duì)特定的進(jìn)度表可能完全沒有任何基本需求來提供任何代碼分離,或者代碼分離可能已經(jīng)以編譯的形式(程序集)存在。當(dāng)編譯序列化進(jìn)度表時(shí),指向有效地?fù)?dān)當(dāng)該進(jìn)度表的代碼分離的現(xiàn)有已編譯類型是可能的。創(chuàng)建該已編譯類型的派生類型,且該新類型擔(dān)當(dāng)代碼分離以確保創(chuàng)建了唯一的類型來表示該新進(jìn)度表。序列化體系結(jié)構(gòu)序列化基礎(chǔ)結(jié)構(gòu)提供了一種模塊化的、格式中立且容易擴(kuò)展的機(jī)制來序列化配合引擎活動(dòng)樹。具體地,調(diào)用者(例如,應(yīng)用程序或用戶)向序列化管理器請(qǐng)求對(duì)象(或活動(dòng))A的序列化器。對(duì)象A的類型的元數(shù)據(jù)元屬性將對(duì)象A綁定到所請(qǐng)求類型的序列化器。調(diào)用者然后要求序列化器序列化對(duì)象A。對(duì)象A的序列化器然后序列化對(duì)象A。對(duì)于在序列化時(shí)遇到的每一對(duì)象,序列化器向序列化管理器請(qǐng)求另外的序列化器。序列化的結(jié)果被返回給調(diào)用者。配合引擎組件模型中的每一活動(dòng)可參與序列化。在一個(gè)實(shí)施例中,序列化器組件不是活動(dòng)類本身的一部分。相反,該組件通過在與該活動(dòng)相關(guān)聯(lián)的類中注釋序列化器元屬性來指定。序列化器元屬性指向用于序列化該活動(dòng)類型的對(duì)象的類。在另一實(shí)施例中,活動(dòng)類型的提供者組件覆蓋了由該活動(dòng)提供的默認(rèn)序列化器。設(shè)計(jì)器序列化基于元數(shù)據(jù)、序列化器和序列化管理器。元數(shù)據(jù)元屬性用于將類型與序列化器相關(guān)?!俺绦蛞龑?dǎo)”元屬性可用于安裝為沒有序列化器的類型提供序列化器的對(duì)象。序列化器是知道如何序列化特定類型或類型作用域的對(duì)象。對(duì)每一數(shù)據(jù)格式存在一基類。例如,可以有知道如何將對(duì)象轉(zhuǎn)換成XML的XmlSerializer(XML序列化器)基類。本發(fā)明是獨(dú)立于任何特定序列化格式的通用體系結(jié)構(gòu)。序列化管理器是對(duì)用于序列化對(duì)象圖的所有各種序列化器提供信息存儲(chǔ)的對(duì)象。例如,五十個(gè)推想的圖可具有五十個(gè)不同的序列化器,它們都生成其自己的輸出。序列化管理器可由這些序列化器使用以在必要時(shí)彼此通信。在一個(gè)實(shí)施例中,與使用類屬對(duì)象元數(shù)據(jù)的序列化器耦合的序列化提供者的使用提供了一種回叫機(jī)制,其中,給予對(duì)象向給定類型提供序列化器的機(jī)會(huì)??赏ㄟ^諸如AddSerializationProvider(添加序列化提供者)等方法來向序列化管理器給予序列化提供者。序列化提供者可通過向序列化器添加諸如DefaultSerializationProviderAttribute(默認(rèn)序列化提供者屬性)等元屬性而被自動(dòng)添加到序列化管理器。在一個(gè)實(shí)施例中,格式由以下規(guī)則來規(guī)定對(duì)象被序列化為xml元素、對(duì)象的屬性被歸類為簡(jiǎn)單屬性(例如,序列化為xml元屬性)或復(fù)雜屬性(序列化為子元素)、以及對(duì)象的子對(duì)象被序列化為子元素。子對(duì)象的定義可在各個(gè)對(duì)象之間不同。以下示例是while活動(dòng)的序列化,它具有Send活動(dòng)作為其子對(duì)象之一。<WhileID=″while1″><ConditionRule><CodeExpressionRuleDeclaration><ExpressionName=″whileCondition″/></CodeExpressionRuleDeclaration></ConditionRule><SendHasTypedChannel=″True″ID=″send1″><MessageName=″msg1″Type=″System.UInt32″/><OnBeforeSendName=″onBeforeSend1″/><TypedChannelType=″System.Collections.IList″Operation=″AddIndex″Name=″Foo″/></Send></While>在其中用于序列化的語言是XOML的實(shí)施例中,當(dāng)編譯進(jìn)度表時(shí),每一XOML元素被序列化成其各自的對(duì)象。對(duì)象包括簡(jiǎn)單和復(fù)雜類型兩者。接下來描述每一活動(dòng)的XOML表示之間的映射及其到創(chuàng)作對(duì)象模型的映射。XOML的序列化在原語(Primitive)和合成(Composite)活動(dòng)之間有所不同。原語活動(dòng)的簡(jiǎn)單類型被序列化為該活動(dòng)類型上的元屬性。原語活動(dòng)的復(fù)雜類型被序列化為子元素。作為一個(gè)示例,以下是Send活動(dòng)的XOML表示。<SendID=″send1″HasTypedChannel=″False″><MessageName=″message1″Type=″System.String″/><UntypedChannelName=″c1″/></Send>以與原語類型序列化類似的方式,合成活動(dòng)的簡(jiǎn)單類型被序列化為該活動(dòng)類型上的元屬性。然而,按照定義,合成活動(dòng)封裝了嵌套的活動(dòng)。每一嵌套的活動(dòng)被序列化為另一子元素。作為一個(gè)示例,以下是While活動(dòng)的XOML表示。<WhileID=″while1″><ConditionRule><CodeExpressionRule><ExpressionName=″test″/></CodeExpressionRule></ConditionRule></While>過程/工作流視圖和序列化的表示之間存在強(qiáng)關(guān)系。當(dāng)以工作流的序列化(例如,XOML)表示或工作流的分離代碼創(chuàng)作時(shí),其它表示將招致改變。由此,當(dāng)開發(fā)者在XOML和過程/工作流視圖之間切換時(shí),修改活動(dòng)的XOML(或在合成活動(dòng)的情況下修改其構(gòu)成部分)直接在過程/工作流視圖中得到反映。反過來也是適用的。修改過程/工作流視圖中的活動(dòng)導(dǎo)致XOML內(nèi)的適當(dāng)修改。作為一個(gè)示例,過程/工作流中的活動(dòng)的刪除導(dǎo)致同一活動(dòng)的XOML中XML元素的移除。在過程/工作流視圖和分離的代碼之間也發(fā)生往返。在創(chuàng)建XOML代碼的過程中,如果XOML定義不符合預(yù)定義的接口要求,則在違反的XML元素下加下劃線,或用其它方式可視地向開發(fā)者標(biāo)識(shí)。如果開發(fā)者切換到過程視圖,則將向他們警告在XOML內(nèi)存在錯(cuò)誤,且設(shè)計(jì)器提供一鏈接,開發(fā)者可點(diǎn)擊該鏈接并且會(huì)被導(dǎo)航到違反的元素。該同一錯(cuò)誤出現(xiàn)在任務(wù)面板中,并且在雙擊該錯(cuò)誤之后,開發(fā)者將會(huì)被導(dǎo)航到XOML中違反的元素。從XOML文件創(chuàng)建活動(dòng)樹(反序列化)本發(fā)明包括從工作流的聲明性表示(例如,XOML)文件反序列化工作流的方法。本發(fā)明包括用于為工作流中的每一活動(dòng)檢索儲(chǔ)存在工作流的聲明性表示中的元數(shù)據(jù)、編譯與工作流中的每一活動(dòng)相關(guān)聯(lián)的軟件代碼、以及根據(jù)所檢索的元數(shù)據(jù)和所編譯的軟件代碼重新創(chuàng)建工作流。在一個(gè)實(shí)施例中,CreateEditorInstance()函數(shù)(創(chuàng)建編輯器實(shí)例)創(chuàng)建DesignSurface(設(shè)計(jì)表面)對(duì)象,然后對(duì)DesignSurface對(duì)象調(diào)用BeginLoad()函數(shù)(開始加載),向其傳遞實(shí)際的加載器對(duì)象,最終以對(duì)DesignerLoader()函數(shù)(設(shè)計(jì)器加載器)的BeginLoad()調(diào)用而結(jié)束。PerformLoad()函數(shù)(執(zhí)行加載)讀取文本緩沖區(qū)對(duì)象,并將其反序列化到配合引擎組件模型分層結(jié)構(gòu)。本發(fā)明走查該分層結(jié)構(gòu),并將活動(dòng)插入到設(shè)計(jì)表面以加載視件工作室(visualsutdio)中的組件。本發(fā)明也監(jiān)聽對(duì)XOML文件的改變以跟蹤分層結(jié)構(gòu)和項(xiàng)標(biāo)識(shí)改變,來更新視件工作室高速緩存中的值。次要文檔數(shù)據(jù)列表包括對(duì)用戶不可見的次要文檔的列表,配合引擎設(shè)計(jì)器在這些次要文檔上工作。例如,用戶尚未打開分離代碼文件,但當(dāng)用戶在配合引擎設(shè)計(jì)器中做出改變時(shí),對(duì)該分離代碼文件做出改變是可能的。由于該文件對(duì)用戶是不可見的,因此該文件作為次要文檔來維護(hù)。只要保存XOML文件,就自動(dòng)保存次要文檔。如果這些文件之一的名字改變,或者文件被刪除,則本發(fā)明相應(yīng)地更新對(duì)應(yīng)的次要文檔對(duì)象。對(duì)象樹的示例性反序列化準(zhǔn)則如下。xml元素首先作為父對(duì)象的屬性來處理。如果父對(duì)象沒有具有該元素標(biāo)簽名的屬性,則該元素作為父對(duì)象的子對(duì)象來處理。xml元屬性作為父對(duì)象上的簡(jiǎn)單屬性來處理。在適用上述序列化代碼的一個(gè)示例性反序列化中,<While>元素作為適用xml名字空間信息創(chuàng)建的對(duì)象來處理。<ConditionRule>元素作為While活動(dòng)的屬性來處理。<CodeExpressionRuleDeclaration>元素作為其值將被應(yīng)用于ConditionRule屬性的對(duì)象來處理。<Send>元素首先作為While活動(dòng)的屬性來嘗試,但“While”活動(dòng)沒有具有名字為“Send”的屬性,因此<Send>元素作為對(duì)象來處理,并作為子活動(dòng)添加到while活動(dòng)。<Message>元素作為Send活動(dòng)的屬性來處理。由于Send上的Message屬性是只讀的,因此Message元素的內(nèi)容被認(rèn)為是Message對(duì)象的內(nèi)容。類似的規(guī)則也適用于<OnBeforeSend>和<TypedChannel>元素的反序列化。在以下條件下,XOML反序列化將會(huì)嚴(yán)重失敗XOML代碼不是良好形成的、XomlDocument不是XOML代碼中的第一個(gè)元素、以及XOML代碼中的第一個(gè)活動(dòng)不能被反序列化。將向開發(fā)者呈現(xiàn)出錯(cuò)消息,當(dāng)從XOML視圖切換到過程/工作流視圖時(shí),通過該消息他們可被導(dǎo)航到違反的XML元素。主宿配合引擎設(shè)計(jì)器設(shè)計(jì)器框架可被主宿在任何應(yīng)用程序中。這對(duì)于第三方應(yīng)用程序要在其各自的環(huán)境中呈現(xiàn)工作流而言是非常有用的特征。它也允許第三方通過重新主宿和定址設(shè)計(jì)器表面來開發(fā)關(guān)于配合引擎設(shè)計(jì)器的工具。本發(fā)明的框架期望主宿容器應(yīng)用程序能夠提供諸如編輯器和/或文本緩沖區(qū)等一組服務(wù)。重新主宿設(shè)計(jì)器的一個(gè)步驟是創(chuàng)建加載器和設(shè)計(jì)表面。加載器負(fù)責(zé)加載XOML文件,并構(gòu)造維護(hù)活動(dòng)的設(shè)計(jì)器宿主基礎(chǔ)結(jié)構(gòu)。設(shè)計(jì)表面維護(hù)其中的設(shè)計(jì)器宿主基礎(chǔ)結(jié)構(gòu),并向宿主提供服務(wù)且與設(shè)計(jì)表面交互。設(shè)計(jì)表面擔(dān)當(dāng)服務(wù)容器以及服務(wù)提供者。在一個(gè)示例中,執(zhí)行以下代碼來加載XOML文檔并構(gòu)造維護(hù)其中的活動(dòng)的設(shè)計(jì)器宿主。this.loader.XomlFile=filePath;if(this.surface.IsLoaded==false)this.surface.BeginLoad(this.loader);以下服務(wù)啟用了設(shè)計(jì)器中的不同函數(shù)。ISelectionService函數(shù)(選擇服務(wù))維護(hù)所選中的對(duì)象。IToolboxService函數(shù)(工具箱服務(wù))管理與工具箱的交互。IMenuCommandService函數(shù)(菜單命令服務(wù))管理與菜單的交互。ITypeProvider函數(shù)(類型提供者)啟用類型系統(tǒng)。另外,可以有由設(shè)計(jì)器主宿環(huán)境提供的其它服務(wù),以啟用高級(jí)的設(shè)計(jì)器特征。類型流是本發(fā)明的組件模型框架中的一個(gè)組件。當(dāng)設(shè)計(jì)器主宿在項(xiàng)目系統(tǒng)內(nèi)部時(shí),在每一項(xiàng)目的基礎(chǔ)上創(chuàng)建TypeProvider(類型提供者)對(duì)象。項(xiàng)目中的程序集引用被壓入類型提供者。此外,對(duì)項(xiàng)目中的用戶代碼文件進(jìn)行語法分析,并創(chuàng)建單個(gè)代碼編譯且將其壓入類型提供者。同樣,本發(fā)明監(jiān)聽項(xiàng)目系統(tǒng)中將導(dǎo)致類型系統(tǒng)中的類型改變的事件,并響應(yīng)于改變對(duì)類型提供者做出適當(dāng)?shù)恼{(diào)用來重新加載類型。撤消/恢復(fù)在創(chuàng)建且正確地構(gòu)造了進(jìn)度表之后,開發(fā)者可能希望回退一系列已執(zhí)行的操作。本發(fā)明的撤消和恢復(fù)功能提供了可視的反饋,它示出了哪一活動(dòng)被直接影響。例如,當(dāng)撤消活動(dòng)上的屬性時(shí),被影響的活動(dòng)變?yōu)檫x中。當(dāng)撤消多個(gè)對(duì)象的刪除時(shí),當(dāng)被恢復(fù)到進(jìn)度表時(shí),所涉及的所有對(duì)象變?yōu)檫x中。撤消/恢復(fù)是在其它領(lǐng)域的許多應(yīng)用程序中使用的常見特征,且其意義是被普遍理解的。在配合引擎設(shè)計(jì)器中,撤消/恢復(fù)項(xiàng)在保存時(shí)不被清除。此外,撤消/恢復(fù)可在過程/工作流視圖中、XOML視圖中、當(dāng)開發(fā)者在視圖之間切換時(shí)、以及在分離代碼中執(zhí)行。對(duì)過程/工作流視圖中的以下動(dòng)作提供了撤消/恢復(fù)活動(dòng)拖放(例如,將活動(dòng)從工具箱拖到設(shè)計(jì)表面、將活動(dòng)從進(jìn)度表的一部分移到另一部分、以及將活動(dòng)從一個(gè)設(shè)計(jì)器移到另一設(shè)計(jì)器)、活動(dòng)的配置(例如,指定活動(dòng)的屬性)、以及剪切/復(fù)制/粘貼/刪除。在一個(gè)實(shí)施例中,序列化的視圖(例如,XOML)視圖是提供文本編輯器的標(biāo)準(zhǔn)撤消/恢復(fù)操作的XML編輯器。本發(fā)明的設(shè)計(jì)器向開發(fā)者提供了反饋,指示過程/工作流視圖中做出改變?nèi)缓笤谛蛄谢晥D中撤消將導(dǎo)致序列化代碼的丟失。當(dāng)開發(fā)者在過程/工作流視圖中構(gòu)造進(jìn)度表的一部分時(shí),切換到序列化視圖然后決定執(zhí)行撤消/恢復(fù)操作,將出現(xiàn)警告。示例性操作環(huán)境圖12以計(jì)算機(jī)130的形式示出了通用計(jì)算設(shè)備的一個(gè)示例。在本發(fā)明的一個(gè)實(shí)施例中,諸如計(jì)算機(jī)130等計(jì)算機(jī)適用于此處所示和所描述的其它附圖。計(jì)算機(jī)130具有一個(gè)或多個(gè)處理器或處理單元132以及系統(tǒng)存儲(chǔ)器134。在所示的實(shí)施例中,系統(tǒng)總線136將包括系統(tǒng)存儲(chǔ)器134的各種系統(tǒng)組件耦合至處理器132??偩€136表示若干類型總線結(jié)構(gòu)的任一種的一個(gè)或多個(gè),包括存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線、加速圖形端口、以及使用各種總線體系結(jié)構(gòu)的任一種的處理器或局部總線。作為示例而非局限,這類體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、增強(qiáng)ISA(EISA)總線、視頻電子技術(shù)標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局部總線以及外圍部件互連(PCI)總線,也稱為Mezzanine總線。計(jì)算機(jī)130通常具有至少某種形式的計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可由計(jì)算機(jī)130訪問的任何可用介質(zhì),可包括易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。作為示例而非局限,計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括以用于儲(chǔ)存諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任一方法或技術(shù)實(shí)現(xiàn)的易失性和非易失性,可移動(dòng)和不可移動(dòng)介質(zhì)。例如,計(jì)算機(jī)存儲(chǔ)介質(zhì)包括RAM、ROM、EEPROM、閃存或其它存儲(chǔ)器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲(chǔ)、磁盒、磁帶、磁盤存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可以用來儲(chǔ)存所期望的信息并可由計(jì)算機(jī)130訪問的任一其它介質(zhì)。通信介質(zhì)通常具體化為諸如載波或其它傳輸機(jī)制的已調(diào)制數(shù)據(jù)信號(hào)中的計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任一信息傳送介質(zhì)。本領(lǐng)域的技術(shù)人員熟悉已調(diào)制數(shù)據(jù)信號(hào),它以對(duì)信號(hào)中的信息進(jìn)行編碼的方式設(shè)置或改變其一個(gè)或多個(gè)特征。有線介質(zhì),如有線網(wǎng)絡(luò)或直接連線連接,以及無線介質(zhì),如聲學(xué)、RF、紅外和其它無線介質(zhì),都是通信介質(zhì)的示例。上述任一的組合也應(yīng)當(dāng)包括在計(jì)算機(jī)可讀介質(zhì)的作用域之內(nèi)。系統(tǒng)存儲(chǔ)器134包括易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。在所示的實(shí)施例中,系統(tǒng)存儲(chǔ)器134包括只讀存儲(chǔ)器(ROM)138和隨機(jī)存取存儲(chǔ)器(RAM)140?;据斎?輸出系統(tǒng)142(BIOS)包括如在啟動(dòng)時(shí)幫助在計(jì)算機(jī)130內(nèi)的元件之間傳輸信息的基本例程,通常儲(chǔ)存在ROM138中。RAM140通常包含處理單元132立即可訪問或者當(dāng)前正在操作的數(shù)據(jù)和/或程序模塊。作為示例而非局限,圖12示出了操作系統(tǒng)144、應(yīng)用程序146、其它程序模塊148和程序數(shù)據(jù)150。計(jì)算機(jī)130也可包括其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。例如,圖12示出了對(duì)不可移動(dòng)、非易失性磁介質(zhì)進(jìn)行讀寫的硬盤驅(qū)動(dòng)器154。圖12也示出了對(duì)可移動(dòng)、非易失性磁盤158進(jìn)行讀寫的磁盤驅(qū)動(dòng)器156以及對(duì)可移動(dòng)、非易失性光盤162,如CDROM或其它光介質(zhì)進(jìn)行讀寫的光盤驅(qū)動(dòng)器160??梢栽谑纠圆僮鳝h(huán)境中使用的其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字視頻帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅(qū)動(dòng)器154、磁盤驅(qū)動(dòng)器156和光盤驅(qū)動(dòng)器160通常通過非易失性存儲(chǔ)器接口,如接口160連接到系統(tǒng)總線136。上文討論并在圖12示出的驅(qū)動(dòng)器及其關(guān)聯(lián)的計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)130提供了計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲(chǔ)。例如,在圖12中,示出硬盤驅(qū)動(dòng)器154儲(chǔ)存操作系統(tǒng)170、應(yīng)用程序172、其它程序模塊174和程序數(shù)據(jù)176。注意,這些組件可以與操作系統(tǒng)144、應(yīng)用程序146、其它程序模塊148和程序數(shù)據(jù)150相同,也可以與它們不同。這里對(duì)操作系統(tǒng)170、應(yīng)用程序172、其它程序模塊174和程序數(shù)據(jù)176給予不同的標(biāo)號(hào)來說明至少它們是不同的副本。用戶可以通過輸入設(shè)備或用戶界面選擇設(shè)備,如鍵盤180和定位設(shè)備182(例如,鼠標(biāo)、跟蹤球或觸摸墊)向計(jì)算機(jī)130輸入命令和信息。其它輸入設(shè)備(未示出)可包括麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些和其它輸入設(shè)備通常通過耦合至系統(tǒng)總線136的用戶輸入接口184連接至處理單元132,但是也可以通過其它接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器188或其它類型的顯示設(shè)備也通過接口,如視頻接口190連接至系統(tǒng)總線136。除監(jiān)視器188之外,計(jì)算機(jī)通常包括其它外圍輸出設(shè)備(未示出),如打印機(jī)和揚(yáng)聲器,它們可通過輸出外圍接口(未示出)連接。計(jì)算機(jī)130可以使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī),如遠(yuǎn)程計(jì)算機(jī)194的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)194可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其它普通網(wǎng)絡(luò)節(jié)點(diǎn),并通常包括許多或所有相對(duì)于計(jì)算機(jī)130所描述的元件。圖12描述的邏輯連接包括局域網(wǎng)(LAN)196和廣域網(wǎng)(WAN)198,但也可包括其它網(wǎng)絡(luò)。LAN136和/或WAN138可以是有線網(wǎng)絡(luò)、無線網(wǎng)絡(luò)、其組合等等。這類網(wǎng)絡(luò)環(huán)境常見于辦公室、企業(yè)作用域計(jì)算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)以及全球計(jì)算機(jī)網(wǎng)絡(luò)(例如,因特網(wǎng))。當(dāng)在局域網(wǎng)網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)130通過網(wǎng)絡(luò)接口或適配器186連接至LAN196。當(dāng)在廣域網(wǎng)網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)130通常包括調(diào)制解調(diào)器178或用于通過WAN198,如因特網(wǎng)建立通信的其它裝置。調(diào)制解調(diào)器178可以是內(nèi)置或外置的,它通過用戶輸入接口184或其它適當(dāng)?shù)臋C(jī)制連接至系統(tǒng)總線136。在網(wǎng)絡(luò)化環(huán)境中,相對(duì)于計(jì)算機(jī)130所描述的程序模塊或其部分可儲(chǔ)存在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備(未示出)中。作為示例而非局限,圖12示出遠(yuǎn)程應(yīng)用程序192駐留在存儲(chǔ)器設(shè)備上。示出的網(wǎng)絡(luò)連接是示例性的,也可以使用在計(jì)算機(jī)之間建立通信鏈路的其它裝置。一般而言,計(jì)算機(jī)130的數(shù)據(jù)處理器通過在不同的時(shí)刻儲(chǔ)存在計(jì)算機(jī)的各種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中的指令來編程。例如,程序和操作系統(tǒng)通常分布在軟盤或CD-ROM上。從那里,它們被安裝或加載到計(jì)算機(jī)的次級(jí)存儲(chǔ)器中。在執(zhí)行時(shí),它們被至少部分地加載到計(jì)算機(jī)的初級(jí)電子存儲(chǔ)器中。此處描述的本發(fā)明包括這些和其它各種類型的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),這些介質(zhì)包含用于實(shí)現(xiàn)以下結(jié)合微處理器或其它數(shù)據(jù)處理器描述的步驟的指令。當(dāng)依照此處描述的方法和技術(shù)編程時(shí),本發(fā)明也包括計(jì)算機(jī)本身。為說明起見,諸如操作系統(tǒng)等程序和其它可執(zhí)行程序組件在此被示出為離散的框。然而,可以認(rèn)識(shí)到,這些程序和組件在不同的時(shí)刻駐留在計(jì)算機(jī)的不同存儲(chǔ)組件中,且由計(jì)算機(jī)的數(shù)據(jù)處理器執(zhí)行。盡管結(jié)合包括計(jì)算機(jī)130的示例性計(jì)算系統(tǒng)環(huán)境來描述,然而本發(fā)明也可用眾多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置來操作。該計(jì)算系統(tǒng)環(huán)境并非對(duì)本發(fā)明的使用作用域或功能提出任何局限。此外,該計(jì)算環(huán)境不應(yīng)當(dāng)被解釋為對(duì)示例性操作環(huán)境中所示的組件的任一個(gè)或其組合具有任何依賴性或要求??蛇m用于本發(fā)明的公知的計(jì)算系統(tǒng)、環(huán)境和/或配置的示例可包括,但不限于,個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持式或膝上設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程消費(fèi)者電子產(chǎn)品、移動(dòng)電話、網(wǎng)絡(luò)PC、小型機(jī)、大型計(jì)算機(jī)、包括上述系統(tǒng)或設(shè)備的任一個(gè)的分布式計(jì)算環(huán)境等等。本發(fā)明可以在諸如由一個(gè)或多個(gè)計(jì)算機(jī)或其它設(shè)備執(zhí)行的程序模塊等計(jì)算機(jī)可執(zhí)行指令的一般上下文環(huán)境中描述。一般而言,程序模塊包括但不限于,例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。本發(fā)明也可以在分布式計(jì)算環(huán)境中實(shí)踐,其中,任務(wù)由通過通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備來執(zhí)行。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)器存儲(chǔ)設(shè)備的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。軟件體系結(jié)構(gòu)上下文中的接口包括軟件模塊、組件、代碼部分或其它計(jì)算機(jī)可執(zhí)行指令序列。例如,接口包括訪問第二模塊的第一模塊,以代表該第一模塊執(zhí)行任務(wù)。在一個(gè)示例中,第一和第二模塊包括諸如由操作系統(tǒng)提供的應(yīng)用程序編程接口(API)、組件對(duì)象模型(COM)接口(例如,用于對(duì)等應(yīng)用程序通信)、以及可擴(kuò)展標(biāo)記語言元數(shù)據(jù)互換格式(XMI)的接口(例如,用于web服務(wù)之間的通信)。接口可以是緊耦合的同步實(shí)現(xiàn),諸如Java2平臺(tái)企業(yè)版(J2EE)中、COM或分布式COM(DCOM)示例。作為替換或除此之外,接口可以是松耦合的異步實(shí)現(xiàn),諸如web服務(wù)中(例如,使用簡(jiǎn)單對(duì)象訪問協(xié)議)。一般而言,接口包括以下特征的任一組合緊耦合、松耦合、同步和異步。此外,接口可以符合標(biāo)準(zhǔn)協(xié)議、專有協(xié)議或標(biāo)準(zhǔn)和專有協(xié)議的任一組合。此處描述的接口可以都是單個(gè)接口的一部分,或可以被實(shí)現(xiàn)為單獨(dú)的接口或其中的任何組合。接口可以本地或遠(yuǎn)程地執(zhí)行以提供功能。此外,接口可包括比所示或所描述的更多或更少的功能。此處所示和描述的方法的執(zhí)行或?qū)崿F(xiàn)的順序不是關(guān)鍵的,除非另外指定。即,方法的各元素可以用任何順序執(zhí)行,除非另外指定,并且方法可包括比此處所解釋的更多或更少的元素。例如,在本發(fā)明的范圍內(nèi)可以構(gòu)想,可以另一元素之前、與其同時(shí)或在其之后執(zhí)行特定元素。當(dāng)介紹本發(fā)明或其實(shí)施例的元素時(shí),冠詞“一”、“一個(gè)”、“該”和“所述”意指存在一個(gè)或多個(gè)元素。術(shù)語“包含”、“包括”或“具有”旨在包括性的,且意味著除所列出的元素之外還可以有其它元素。鑒于以上內(nèi)容,可以看到,可以實(shí)現(xiàn)本發(fā)明的若干目標(biāo)并且可以達(dá)到其它有利的結(jié)果。由于可以在以上構(gòu)造、產(chǎn)品和方法中做出各種改變而不脫離本發(fā)明的范圍,因此預(yù)期以上描述中包含且在附圖中示出的所有內(nèi)容都應(yīng)當(dāng)在說明性而非限制性的意義上解釋。附錄A示例性活動(dòng)及其示例性實(shí)現(xiàn)示例性活動(dòng)包括以下活動(dòng)Send(發(fā)送)、SendRequest(發(fā)送請(qǐng)求)、SendResponse(發(fā)送響應(yīng))、Receive(接收)、ReceiveRequest(接收請(qǐng)求)、ReceiveResponse(接收響應(yīng))、Code(代碼)、Delay(延遲)、Fault(錯(cuò)誤)、Suspend(掛起)、Terminate(終止)、InvokeSchedule(調(diào)用進(jìn)度表)、InvokeSchedules(調(diào)用多個(gè)進(jìn)度表)、InvokeWebService(調(diào)用web服務(wù))、DotNetEventSource(.NET事件源)、DotNetEventSink(.NET事件宿)、Sequence(順序)、Parallel(并行)、While、ConditionalBranch(條件分支)、Conditional(條件)、Constrained(約束)、ConstrainedActivityGroup(約束活動(dòng)組)(CAG)、EventDriven(事件驅(qū)動(dòng))、Listen(監(jiān)聽)、EventHandlers(事件處理程序)、ExceptionHandler(異常處理程序)、ExceptionHandlers(多個(gè)異常處理程序)、Compensate(補(bǔ)償)、CompensationHandler(補(bǔ)償處理程序)、Scope(作用域)以及Schedule(進(jìn)度表)。每一示例性活動(dòng)具有與其相關(guān)聯(lián)的元數(shù)據(jù)。元數(shù)據(jù)由與該活動(dòng)相關(guān)聯(lián)的序列化器傳輸?shù)焦ぷ髁鞯穆暶餍员硎尽@?,元?shù)據(jù)可包括可任選的代碼分離方法以及可任選的相關(guān)集集合。Send活動(dòng)動(dòng)配合引擎提供用于發(fā)送消息的三種活動(dòng)(例如,Send、SendRequest以及SendResponse),其每一個(gè)著重于一個(gè)不同的使用情況。另外,由于三個(gè)活動(dòng)共享某一元數(shù)據(jù),因此定義了一抽象基類并將其用作所有三個(gè)活動(dòng)的超類。Receive活動(dòng)配合引擎提供了用于接收消息的三種活動(dòng)(例如,Receive、ReceiveRequest以及ReceiveResponse),其每一個(gè)著重于一個(gè)不同的使用情況。另外,由于三個(gè)活動(dòng)共享某一元數(shù)據(jù),因此定義了一抽象基類并將其用作所有三個(gè)活動(dòng)的超類。CodeCode活動(dòng)執(zhí)行元數(shù)據(jù)中指示的代碼分離方法。DelayDelay活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來生成DateTime(日期時(shí)間)值。它內(nèi)部地將其實(shí)例上的TimeoutValue(超時(shí)值)屬性設(shè)為該值。如果DateTime是過去的,則Delay立即完成。否則,它設(shè)置一定時(shí)器預(yù)定,使得當(dāng)定時(shí)器激發(fā)時(shí)將通知Delay。當(dāng)定時(shí)器激發(fā)時(shí),通知Delay并且它完成。FaultFault活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來生成Exception(異常)對(duì)象。它然后拋出該異常。SuspendSuspend活動(dòng)掛起當(dāng)前的進(jìn)度表實(shí)例。TerminateTerminate活動(dòng)終止當(dāng)前的進(jìn)度表實(shí)例。InvokeScheduleInvokeSchedule活動(dòng)調(diào)用進(jìn)度表。InvokeWebService通過代理類調(diào)用web服務(wù),轉(zhuǎn)遞和接收所指定的參數(shù)。DotNetEventSink阻斷由先前調(diào)用的進(jìn)度表實(shí)例引發(fā)的指定事件的等待通知。DotNetEventSource引發(fā)所指定的事件,并立即完成執(zhí)行。SequenceSequence活動(dòng)以有序的方式協(xié)調(diào)一組子活動(dòng)的執(zhí)行,每次一個(gè)。ParallelParallel活動(dòng)并發(fā)地執(zhí)行一組子活動(dòng)。While迭代地執(zhí)行子活動(dòng)。ConditionBranch對(duì)每一Sequence語義執(zhí)行子活動(dòng)。ConditionalConditional活動(dòng)包含一組有序的ConditionalBranch活動(dòng)。Constrained當(dāng)CAG告知要執(zhí)行Constrained活動(dòng)時(shí),它僅僅執(zhí)行它所包裝的活動(dòng)。CAG(ConstrainedActivityGroup)當(dāng)CAG執(zhí)行時(shí),它基于其啟用和禁用的約束的評(píng)估來執(zhí)行(并重新執(zhí)行)子活動(dòng)。Task對(duì)由一個(gè)或多個(gè)主體執(zhí)行的工作的外部單元建模。EventDriven包裝其執(zhí)行由“事件”活動(dòng)觸發(fā)的活動(dòng)。Listen條件地執(zhí)行EventDriven活動(dòng)的n個(gè)子活動(dòng)之一。EventHandlersEventHandlers活動(dòng)簡(jiǎn)單地持有一組EventDriven活動(dòng),以供相關(guān)聯(lián)的Scope使用。ExceptionHandler用表示作用域的捕捉塊(catchblock)的元數(shù)據(jù)包裝活動(dòng)。ExceptionHandlers包裝一組有序的ExceptionHandler活動(dòng)。Compensate補(bǔ)償已完成的子作用域。CompensationHandler包裝被定義為用于作用域的補(bǔ)償處理程序的子活動(dòng)。Scope作用域是事務(wù)邊界;異常處理邊界;補(bǔ)償邊界;事件處理邊界;以及消息、變量、相關(guān)集以及通道聲明(即,共享數(shù)據(jù)狀態(tài))的邊界、Scope內(nèi)活動(dòng)的執(zhí)行是順序的,并且由此,當(dāng)構(gòu)造作用域時(shí),所包含的活動(dòng)是明確地排序的,如同在Sequence中一樣。ScheduleSchedule是配合引擎將執(zhí)行的唯一頂層活動(dòng)。CompositeActivities允許控制流的補(bǔ)償活動(dòng)類型是Sequence、Parallel、Constrained、ActivityGroup、Conditional、While、Listen。另外,Scope和Schedule是擔(dān)當(dāng)容器的補(bǔ)償活動(dòng)類型,該容器具有其中的活動(dòng)的隱含排序。附錄B可視設(shè)計(jì)器進(jìn)度表通常由許多活動(dòng)組成。每一活動(dòng)具有其自己的相關(guān)聯(lián)的設(shè)計(jì)器。在活動(dòng)已從工具箱拖曳到圖形用戶界面的設(shè)計(jì)表面上之后,設(shè)計(jì)器將自身表現(xiàn)為圖形用戶界面(UI)(例如,視件工作室(visualstudio))中的圖標(biāo)。該設(shè)計(jì)器在創(chuàng)作對(duì)象模型(AOM)上提供UI表示。開發(fā)者能夠依照該對(duì)象模型來直接編程,并且在活動(dòng)上設(shè)置屬性,或者使用該設(shè)計(jì)器并充分利用視件工作室的屬性瀏覽器?;顒?dòng)創(chuàng)建和配置創(chuàng)建進(jìn)度表包括定義組成它的活動(dòng)和任務(wù)。該配合引擎設(shè)計(jì)器允許開發(fā)者從該工具箱中選擇活動(dòng)(例如,在配合引擎活動(dòng)的類別下),并將它拖曳到設(shè)計(jì)器表面上。如果活動(dòng)已被放入進(jìn)度表并需要被移動(dòng),則開發(fā)者能夠選擇它(通過點(diǎn)擊它),并將它拖曳到它需要去的進(jìn)度表的區(qū)域。如果開發(fā)者在拖放的同時(shí)按住ctrl鍵,那么,復(fù)制所選擇的活動(dòng)。運(yùn)行布置特征根據(jù)所執(zhí)行的構(gòu)造語義確認(rèn)的糾正,來提供可能的落點(diǎn)(目標(biāo)),作為可視指示符??梢詫⒒顒?dòng)拖放到進(jìn)度表上的這些目標(biāo)中的任一個(gè)。自動(dòng)滾動(dòng)特征也參與拖放的上下文。當(dāng)處理大型進(jìn)度表時(shí),通過將活動(dòng)拖向?qū)⒎胖玫倪M(jìn)度表的區(qū)域,可以訪問對(duì)當(dāng)前不在視件工作室視見區(qū)內(nèi)的設(shè)計(jì)器區(qū)域的導(dǎo)航。跨越同一項(xiàng)目中的各個(gè)進(jìn)度表并跨越同一解決方案中的其他項(xiàng)目中的各個(gè)進(jìn)度表支持拖放。在活動(dòng)被放到設(shè)計(jì)表面上之后,開發(fā)者經(jīng)由屬性集來配置該活動(dòng)??梢栽跇?biāo)準(zhǔn)視件工作室屬性瀏覽器中編輯這些屬性。每一活動(dòng)控制什么屬性在屬性瀏覽器中是可查看的。對(duì)話框的指導(dǎo)方針為了協(xié)助開發(fā)者配置各種活動(dòng),設(shè)計(jì)者提供各種對(duì)話框或“子設(shè)計(jì)器”。為活動(dòng)的各屬性而調(diào)用這些對(duì)話框的每一個(gè)。當(dāng)在屬性瀏覽器中用省略號(hào)來注解它時(shí),開發(fā)者能夠?yàn)閷傩哉{(diào)用任何設(shè)計(jì)器。類型瀏覽器對(duì)話當(dāng)通過屬性瀏覽器來配置活動(dòng)時(shí),開發(fā)者經(jīng)常需要指定一種類型的屬性或?qū)ο蟆H绻_發(fā)者知道他們要求的類型(例如,System.String),那么,開發(fā)者在屬性瀏覽器中直接鍵入它。類型瀏覽器為項(xiàng)目中的與該屬性的期望類型相匹配的所有編譯的引用程序集提供可視化。在程序集出現(xiàn)在類型瀏覽器中之前,必須首先編譯引用項(xiàng)目?;谒渲玫奶囟ɑ顒?dòng)屬性,類型瀏覽器過濾向開發(fā)者顯示的類型。根據(jù)底層活動(dòng)所預(yù)期的類型,類型瀏覽器過濾可序列化類以及實(shí)現(xiàn)IComparable的接口和類。例如,通過從發(fā)送活動(dòng)上的消息屬性啟動(dòng)瀏覽器,該瀏覽器將列出可序列化類。配合引擎將消息類型、端口類型和相關(guān)類型識(shí)別為第一類過程類型。以下表格示出了具有CLR類型的這些類型的映射。表B1.到CLR類型的示例性映射在一個(gè)實(shí)施例中,類型瀏覽器圖形用戶界面不可調(diào)整大小,但為兩個(gè)子窗口中的每一個(gè)提供水平滾動(dòng)條和垂直滾動(dòng)條。左邊的子窗口的默認(rèn)分類次序基于當(dāng)前項(xiàng)目的引用程序集中所列出的類型名稱而升序。在右邊的子窗口內(nèi),存在兩列“類型名稱”和“完全合格的名稱”。默認(rèn)分類次序基于“類型名稱”而降序。但是,這兩列都可以被分類?!邦愋兔Q”列可以被調(diào)整大小,以顯示完整的類型名稱。當(dāng)開發(fā)者將焦點(diǎn)放在每個(gè)程序集上時(shí),右邊的子窗口顯示容納在該程序集內(nèi)的、允許選擇的類型(如上所述)。一旦選擇了有效類型,這兩個(gè)子窗口下面的文本框就提供類型的名稱、以及它被容納在哪個(gè)程序集內(nèi)。該程序集信息提供程序集名稱、版本號(hào)、文化和公鑰記號(hào)。在發(fā)生該選擇以前,文本為“請(qǐng)從列表中選擇類型”。開發(fā)者最終決定選擇類型還是退出瀏覽器。當(dāng)選擇了與該活動(dòng)的屬性相匹配的類型時(shí),啟用“OK”按鈕。當(dāng)開發(fā)者重新調(diào)用屬性瀏覽器對(duì)話框時(shí),自動(dòng)選擇該類型和引用的程序集。所提供的用于協(xié)助開發(fā)者配置活動(dòng)的各種屬性的另一種類型的瀏覽器是相關(guān)性設(shè)置瀏覽器。在運(yùn)行的進(jìn)度表中,發(fā)送到進(jìn)度表的消息實(shí)際上意在用于特定的進(jìn)度表實(shí)例。例如,關(guān)于購貨訂單#123的發(fā)票必須被發(fā)回到始發(fā)(發(fā)出)該購貨訂單的同一進(jìn)度表實(shí)例。為了將入站消息與適當(dāng)?shù)倪M(jìn)度表實(shí)例相匹配,消息和進(jìn)度表實(shí)例共享被稱作“相關(guān)集”的關(guān)鍵字。相關(guān)集在Send和Receive活動(dòng)上定義。相關(guān)集瀏覽器用來幫助配置相關(guān)集。要定義的第一個(gè)項(xiàng)是相關(guān)集的名稱。如果開發(fā)者正在創(chuàng)建新的相關(guān)集,那么,他們能夠直接輸入其名稱。如果他們正在配置Send/Receive以參與預(yù)定義的相關(guān),那么,用這些相關(guān)的名稱來填充下拉列表。從當(dāng)前項(xiàng)目的分離代碼中檢索該列表。該對(duì)話框的輸出是基于這里詳述的配置的分離代碼中的相關(guān)變量。例如,如果創(chuàng)建過串類型化的相關(guān),那么,生成的所得代碼將會(huì)是publicOECorrelation<System.String>MyCorrelation=newOECorrelation<System.String>();)開發(fā)者需要輸入的下一個(gè)配置選項(xiàng)是該相關(guān)所參與的活動(dòng)是否正在對(duì)該集初始化。出于設(shè)計(jì)器的目的,該選項(xiàng)是“真”或“假”。另一個(gè)配置細(xì)節(jié)指定相關(guān)集的類型。按照與配置其它活動(dòng)的類型相類似的方式,可以調(diào)用類型瀏覽器。開發(fā)者能夠添加和移除該活動(dòng)所參與的相關(guān)集。但是,作為在分離代碼中所定義的相關(guān)的結(jié)果,活動(dòng)可以參與先前的活動(dòng)內(nèi)所定義的相關(guān)。同樣,移除相關(guān)實(shí)際上移除了活動(dòng)對(duì)該相關(guān)的參與,而不是分離代碼所生成的代碼。如果開發(fā)者希望使該相關(guān)不再出現(xiàn),那么他們有責(zé)任從分離代碼中移除該定義。該選項(xiàng)卡順序是相關(guān)集、名稱、下拉選取器、添加、移除去、OK、取消和幫助。如果定義了多個(gè)相關(guān)集,那么,該選項(xiàng)卡將在添加之前和下拉選取器之后的下一個(gè)所定義的相關(guān)集處停止。開發(fā)者最終決定創(chuàng)建和/或移除相關(guān),或者退出該瀏覽器。當(dāng)已提供相關(guān)名稱和類型時(shí),啟用OK按鈕。點(diǎn)擊OK會(huì)生成關(guān)于新的相關(guān)集的任何分離代碼,并將活動(dòng)添加到所定義的相關(guān)。選擇取消或敲擊Esc鍵,可允許該開發(fā)者退出瀏覽器,而不會(huì)對(duì)該活動(dòng)進(jìn)行更改。如果活動(dòng)還沒有被正確地配置,那么,設(shè)計(jì)器為開發(fā)者提供廣泛的反饋需要配置哪一活動(dòng)、以及如何配置每一活動(dòng)。約束設(shè)計(jì)器對(duì)話框不管進(jìn)度表使用哪一約束技術(shù),本發(fā)明都為開發(fā)者提供創(chuàng)作約束的能力。對(duì)于開發(fā)者而言,使用拖放隱喻來寫代碼是不自然的行為。所以,用于于約束構(gòu)造的工具支持使用鼠標(biāo)和使用鍵盤來定義約束的能力。約束的最終生成被持久化為XOML。這樣,所生成的約束與現(xiàn)有的XOML對(duì)象模型一致,所以,它將允許開發(fā)者手工編輯約束定義。為約束生成而提供的UI協(xié)助用戶創(chuàng)建約束并對(duì)它進(jìn)行修改。這暗示以前生成的(和可能被修改的)約束與UI之間的往返。用戶模型給定允許約束定義的活動(dòng),開發(fā)者定位對(duì)應(yīng)的約束屬性,并且,在下拉列表中指出通過選擇適當(dāng)?shù)南吕斜韥矶x約束的愿望。在處理程序的定義之后,在屬性瀏覽器中用省略號(hào)來注解屬性,以調(diào)用約束編輯器。開發(fā)者能夠指定約束的名稱。該名稱被持久化為XOML,具有該約束定義的其余部分。使用定義網(wǎng)格內(nèi)的四個(gè)列“操作數(shù)”、“算子”、“值”、以及“通過...來分組”,來進(jìn)行約束定義。操作數(shù)是包含將參與約束的算子的下拉列表。開發(fā)者能夠直接鍵入該下拉列表,并使用自動(dòng)完成來迅速選擇所需的算子。操作數(shù)是定義將要在約束中使用的算子的下拉列表。開發(fā)者可以將算子直接鍵入下拉列表,該下拉列表將迅速選擇所需的算子。值是將要在約束中使用的開發(fā)者定義的值。一旦保存了約束,就將該值與所選擇的屬性進(jìn)行比較,以確保類型匹配。如果類型不匹配,那么,出現(xiàn)消息,例如,“操作數(shù)類型和值類型不匹配”,并且,開發(fā)者被定向到違反的謂詞?!巴ㄟ^...來分組”列是具有包括“AND”或“OR”兩個(gè)可接受值的下拉列表。當(dāng)約束定義正在進(jìn)行時(shí),開發(fā)者能夠在定義網(wǎng)格下的不可編輯對(duì)話框中查看該約束。這允許開發(fā)者按更直截了當(dāng)?shù)姆绞絹聿榭醇s束。輸出將會(huì)類似于以下內(nèi)容((A<3)與(B>C))AND(D=3))OR(F=5)?;顒?dòng)錯(cuò)誤處理“智能標(biāo)簽”本發(fā)明提供幫助配置特定活動(dòng)的一些子設(shè)計(jì)器,例如,類型瀏覽器、相關(guān)集瀏覽器和規(guī)則設(shè)計(jì)器。當(dāng)活動(dòng)的配置不充分時(shí),用類似驚嘆號(hào)智能標(biāo)簽的圖標(biāo)來裝飾活動(dòng)的設(shè)計(jì)器。開發(fā)者點(diǎn)擊該圖標(biāo),來看到對(duì)該活動(dòng)專用的配置錯(cuò)誤的下拉列表。對(duì)于與屬性配置有關(guān)的錯(cuò)誤,選擇將焦點(diǎn)移到屬性瀏覽器,并將焦點(diǎn)放在錯(cuò)誤的屬性上。當(dāng)活動(dòng)的所有屬性有效時(shí),該圖標(biāo)消失。設(shè)計(jì)表面特征本發(fā)明的設(shè)計(jì)者也提供在可訪問性方面有幫助的一些其它UI選項(xiàng)。提供過程視圖的上下文內(nèi)的這些特征中的許多,以幫助開發(fā)者操縱大型進(jìn)度表。例如,縮放允許開發(fā)者擴(kuò)展其進(jìn)度表的選擇。存在用于放大/縮小進(jìn)度表的幾個(gè)機(jī)制,其每一個(gè)為特定功能而設(shè)計(jì)。在一個(gè)方法中,開發(fā)者可以通過設(shè)置特定的圖象縮放百分比,來放大進(jìn)度表。示例性百分比是40%、60%、80%、100%、150%、200%、300%和400%??梢酝ㄟ^使用頂層工作流菜單或通過使用滾動(dòng)條上的命令按鈕,來設(shè)置這些等級(jí)。工作流視圖允許該用戶設(shè)置這些縮放等級(jí)。縮放等級(jí)解決關(guān)于龐大的工作流的可縮放性問題??梢允褂庙攲庸ぷ髁鞑藛位蛲ㄟ^使用滾動(dòng)條上的命令按鈕,來設(shè)置縮放等級(jí)??s放等級(jí)不會(huì)影響工作流的編輯;多個(gè)坐標(biāo)系允許工作程視圖實(shí)現(xiàn)這一點(diǎn)。工作流視圖高速緩存縮放因子,然后將它用于呈現(xiàn)和坐標(biāo)變換。通過在Graphics.ScaleTransform方法中選擇它,可在繪圖中使用縮放因子。當(dāng)完成這一點(diǎn)時(shí),基于所使用的縮放來變換使用圖形對(duì)象而完成的所有繪圖。在繪圖之前,將所有這些坐標(biāo)乘以比例縮放因子。當(dāng)用戶利用鼠標(biāo)來執(zhí)行關(guān)于坐標(biāo)變換的任何動(dòng)作時(shí),也使用縮放因子。在另一種方法中,通過從垂直滾動(dòng)條中選擇放大/縮小選項(xiàng)作為選項(xiàng),開發(fā)者可以放大/縮小進(jìn)度表。這會(huì)更改由轉(zhuǎn)變成放大鏡的光標(biāo)所指出的設(shè)計(jì)者的“模式”。然后,開發(fā)者可以“用橡皮圈住”他們希望放大/縮小的進(jìn)度表的區(qū)域。如果選擇放大,那么,通過點(diǎn)擊鼠標(biāo)按鈕,設(shè)計(jì)者可放大(對(duì)于縮小,反之亦然)。但是,當(dāng)處于每個(gè)各自的模式時(shí),開發(fā)者可以按下shift鍵并在放大/縮小之間來回切換。最后,為了退出任一模式,開發(fā)者可以敲擊“Esc”鍵,并將會(huì)重新處于“默認(rèn)”模式。當(dāng)處于“默認(rèn)”模式時(shí),開發(fā)者可以按住“Ctrl”鍵,并利用鼠標(biāo)滾輪來滾動(dòng)到放大??s放等級(jí)不抑制開發(fā)者操縱進(jìn)度表的能力。換言之,開發(fā)者可以操縱、添加/移除活動(dòng),而不管縮放等級(jí)如何。默認(rèn)的縮放等級(jí)是100%。不管視圖如何,都保存縮放設(shè)置狀態(tài)。更明確地說,如果開發(fā)者轉(zhuǎn)換到XOML視圖、打印預(yù)覽、或分離代碼,或者關(guān)閉進(jìn)度表或解決方案,那么,保存縮放狀態(tài)。掃視為開發(fā)者提供“抓住”和移動(dòng)進(jìn)度表的能力。開發(fā)者選擇掃視模式,光標(biāo)變成手狀圖標(biāo)。當(dāng)開發(fā)者點(diǎn)擊鼠標(biāo)時(shí),該手狀圖標(biāo)“抓住”該表面,并且,鼠標(biāo)運(yùn)動(dòng)在鼠標(biāo)的這個(gè)方向上移動(dòng)該表面。掃視可以作為選項(xiàng)來從垂直滾動(dòng)條中訪問。當(dāng)處于掃視模式時(shí),開發(fā)者不能從設(shè)計(jì)器添加/移除活動(dòng)。明確地說,掃視集中于在設(shè)計(jì)器以內(nèi)移動(dòng)進(jìn)度表的當(dāng)前視圖。對(duì)于大型進(jìn)度表,開發(fā)者可能不會(huì)充分利用設(shè)計(jì)器的縮放特征,因而具有進(jìn)度表的不可見的一部分。開發(fā)者仍然需要能夠從工具箱中拖曳新的活動(dòng)并將它添加到進(jìn)度表的能力。在這個(gè)情形中,開發(fā)者可以將活動(dòng)拖曳到他們想要滾動(dòng)的進(jìn)度表的區(qū)域,并且,一旦進(jìn)入該“自動(dòng)滾動(dòng)區(qū)”,箭頭就將會(huì)出現(xiàn),進(jìn)度表就將在活動(dòng)正被拖曳的方向上移動(dòng)。當(dāng)活動(dòng)在開發(fā)者希望導(dǎo)航的方向上進(jìn)入屏幕的可見區(qū)域10%的區(qū)域時(shí),這些箭頭激活并滾動(dòng)設(shè)計(jì)器視圖。具體地,本發(fā)明提供用戶用于導(dǎo)航到工作流的一部分的機(jī)制;集中于并修改那個(gè)部分,并且繼續(xù)編輯工作流的某個(gè)其它部分。自動(dòng)掃視允許用戶獲得所繪制的工作流的全部畫面,并且,放大鏡允許用戶放大工作流的特定部分。自動(dòng)掃視特征與縮放和自動(dòng)滾動(dòng)相繼承,以便用戶可以處理實(shí)在龐大的工作流。為了開始自動(dòng)掃視過程,用戶點(diǎn)擊顯示在垂直滾動(dòng)條上的放大鏡圖標(biāo)。在點(diǎn)擊該圖標(biāo)之后,工作流視圖就進(jìn)入自動(dòng)掃視模式。在這個(gè)模式中,通過調(diào)用TakeMagnifierSnapshot(拍攝放大鏡快照),來拍攝可顯示在視見區(qū)內(nèi)的當(dāng)前工作流快照。這項(xiàng)功能在存儲(chǔ)器位圖中拍攝工作流的快照,而無需縮放因子。在完成這一點(diǎn)之后,計(jì)算工作流的縮放因子,以便可以在視見區(qū)內(nèi)看見大部分的工作流。然后,鼠標(biāo)變換成放大鏡光標(biāo)。該光標(biāo)的熱點(diǎn)被映射到工作流的存儲(chǔ)器位圖的該部分。然后,在放大鏡中顯示存儲(chǔ)器位圖的被映射的部分。對(duì)于非常大的工作流,如果用戶進(jìn)入自動(dòng)滾動(dòng)區(qū)域,那么,會(huì)發(fā)生自動(dòng)滾動(dòng),這修改所顯示的視見區(qū)。一旦自動(dòng)滾動(dòng)停止,捕捉新的視見區(qū)位圖。當(dāng)用戶釋放鼠標(biāo)時(shí),光標(biāo)的熱點(diǎn)被映射到實(shí)際的工作流部分,并且,該部分在屏幕上居中。以下是自動(dòng)掃視的偽代碼-if用戶進(jìn)入自動(dòng)掃視模式-設(shè)置縮放等級(jí),以便盡可能多地顯示工作流-捕捉可視工作流位圖-if用戶正在拖曳鼠標(biāo)-獲得鼠標(biāo)坐標(biāo)-將它映射到工作流位圖-通過復(fù)制所映射的工作流位圖,來繪制放大鏡-if鼠標(biāo)進(jìn)入自動(dòng)滾動(dòng)區(qū),并且可以滾動(dòng)工作流自動(dòng)滾動(dòng)-elseif用戶離開自動(dòng)滾動(dòng)區(qū)-重新捕捉可視工作流位圖-endif-else-獲得鼠標(biāo)釋放的坐標(biāo)-將它映射到工作流區(qū)域-使工作流區(qū)域居中-endif在一個(gè)實(shí)施例中,本發(fā)明通過在工作流的右下側(cè)顯示小掃視窗口,來支持自動(dòng)掃視;其中,用戶能夠看見縮略圖形式的整個(gè)工作流的表示。當(dāng)仍然在導(dǎo)航大型進(jìn)度表的主題中時(shí),文檔大綱特征讓開發(fā)者迅速查看進(jìn)度表,并且,通過在提綱中選擇節(jié)點(diǎn),來將設(shè)計(jì)器導(dǎo)航到所選擇的活動(dòng)。每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)基于其在序列中的布置而排序。通過雙擊節(jié)點(diǎn)或葉,將開發(fā)者導(dǎo)航到進(jìn)度表中所選擇的活動(dòng)。內(nèi)嵌的進(jìn)度表作為文檔大綱中的單個(gè)節(jié)點(diǎn)來呈現(xiàn)。構(gòu)成內(nèi)嵌進(jìn)度表的活動(dòng)將不會(huì)作為文檔大綱中的單獨(dú)條目出現(xiàn)。在任何時(shí)刻,開發(fā)者都能夠執(zhí)行貫穿功能規(guī)范而定義的所有進(jìn)度表操作(添加、刪除、復(fù)制、粘貼、重命名等),并且,相應(yīng)地反映文檔大綱。文檔大綱內(nèi)的活動(dòng)的多個(gè)選擇對(duì)應(yīng)地選擇過程/工作流視圖內(nèi)的這些活動(dòng)。通過按住Ctrl鍵并選擇文檔大綱內(nèi)的節(jié)點(diǎn),可加亮所選擇的節(jié)點(diǎn),以指出它們已被選擇。如果作用域定義了事件和/或異常處理程序,那么,它在與作用域相同的層處顯示。這允許開發(fā)者在一個(gè)地方查看整個(gè)作用域,與必須瀏覽作用域設(shè)計(jì)中的各頁相對(duì)。運(yùn)行布置使用評(píng)估構(gòu)造語義的糾正的能力來提供可以貫穿進(jìn)度表放置哪些活動(dòng)的肯定指示。當(dāng)開發(fā)者將活動(dòng)從工具箱拖曳到設(shè)計(jì)器上時(shí),目標(biāo)出現(xiàn)在進(jìn)度表上。當(dāng)開發(fā)者在目標(biāo)位置附近拖曳節(jié)點(diǎn)時(shí),應(yīng)該激活該目標(biāo)。當(dāng)所拖曳的活動(dòng)的圖標(biāo)抓取并替換原始目標(biāo)時(shí),激活是明顯的。當(dāng)發(fā)生這個(gè)情況時(shí),開發(fā)者可以釋放鼠標(biāo)按鈕,并且,節(jié)點(diǎn)在運(yùn)行目標(biāo)所指出的位置處對(duì)齊進(jìn)度表。在多部分拖放情形中,所顯示的目標(biāo)應(yīng)該是滿足所有語義確認(rèn)的目標(biāo)。合成的概念指的是一個(gè)進(jìn)度表或任務(wù)在其它進(jìn)度表和任務(wù)中的遞歸包含。工作流設(shè)計(jì)器使開發(fā)者能夠容易地開發(fā)進(jìn)度表和任務(wù),然后在其它進(jìn)度表和任務(wù)內(nèi)調(diào)用這些進(jìn)度表和任務(wù)。但是,只要開發(fā)者創(chuàng)建新的進(jìn)度表或新的任務(wù),視件工作室都使(所有類型的)其它配合引擎項(xiàng)目可以經(jīng)由工具箱來獲得工作流或任務(wù)的已編譯版本。為了調(diào)用該已編譯的工作流或任務(wù),開發(fā)者將它從工具箱拖曳到進(jìn)度表上,就象任何其它活動(dòng)一樣。在這個(gè)新的包含進(jìn)度表中,進(jìn)度表內(nèi)嵌直接提供對(duì)該新的進(jìn)度表或任務(wù)的視圖。這是只讀洞察,它提供對(duì)所包含的進(jìn)度表或任務(wù)的內(nèi)部工作方式的查看。進(jìn)度表或任務(wù)內(nèi)的合成活動(dòng)本身可以被擴(kuò)展或?qū)盈B。維持每次擴(kuò)展或?qū)盈B的狀態(tài)。所以,如果外部構(gòu)造(例如,并行或作用域)被折疊,但內(nèi)部構(gòu)造被擴(kuò)展,那么,外部擴(kuò)展將仍然提供擴(kuò)展的內(nèi)部。假設(shè)這是只讀視圖,那么,開發(fā)者能夠?qū)?nèi)嵌進(jìn)度表內(nèi)所保持的活動(dòng)復(fù)制/粘貼和拖放到包含進(jìn)度表。默認(rèn)地,當(dāng)開發(fā)者創(chuàng)建進(jìn)度表時(shí),它參與進(jìn)度表內(nèi)嵌。但是,有一些情形,其中,“被調(diào)用者”進(jìn)度表作者不希望“調(diào)用者”進(jìn)度表查看其進(jìn)度表的內(nèi)部工作方式。在被調(diào)用者進(jìn)度表的創(chuàng)作期間,開發(fā)者能夠指出其進(jìn)度表將可能不會(huì)被內(nèi)嵌。當(dāng)該調(diào)用者開發(fā)者試圖內(nèi)嵌該屬性化進(jìn)度表時(shí),出現(xiàn)消息“該進(jìn)度表的作者不允許進(jìn)度表內(nèi)嵌”。主題配合引擎設(shè)計(jì)器可以主宿在提供主宿環(huán)境的不同應(yīng)用程序中。當(dāng)主宿在其它應(yīng)用程序內(nèi)時(shí),配合引擎設(shè)計(jì)器外觀和觸覺發(fā)生變體,以便它可以混合到主宿應(yīng)用程序中。當(dāng)按照每一用戶的需要主宿在視件工作室開發(fā)環(huán)境內(nèi)時(shí),用戶能夠更改設(shè)計(jì)器的視覺參數(shù)。主題支持允許用戶更改配合引擎設(shè)計(jì)器的視覺參數(shù),而不會(huì)影響設(shè)計(jì)器實(shí)現(xiàn)或修改設(shè)計(jì)器代碼。主題支持對(duì)于它而言具有兩個(gè)部分;第一個(gè)部分在開發(fā)時(shí),另一個(gè)部分在使用時(shí)。在開發(fā)時(shí),設(shè)計(jì)器作者編寫用于參加工作流的活動(dòng)的設(shè)計(jì)器。當(dāng)開發(fā)設(shè)計(jì)器時(shí),設(shè)計(jì)器作者用能夠參與主體支持的方法來編寫設(shè)計(jì)器。這通過開發(fā)者將設(shè)計(jì)器內(nèi)的可配置可視化信息抽象到隨后與使用主題屬性的設(shè)計(jì)器相關(guān)聯(lián)的設(shè)計(jì)器主題類來完成。然后,開發(fā)者在呈現(xiàn)設(shè)計(jì)器可視化時(shí)使用來自設(shè)計(jì)器主題類的信息。當(dāng)用戶正在使用設(shè)計(jì)器時(shí),他/她可以通過編書主題文件來使設(shè)計(jì)器發(fā)生變體。主題文件是個(gè)別地描述每個(gè)設(shè)計(jì)器預(yù)期的可視化參數(shù)的設(shè)計(jì)器主題的集合。通過用戶手工編輯XML文件,或通過默認(rèn)UI,可以創(chuàng)建主題文件。主題允許開發(fā)者定制工作流活動(dòng)的外觀。每項(xiàng)活動(dòng)具有展示可被“主題化”的特定屬性集的對(duì)應(yīng)的設(shè)計(jì)器。通過提供可視化定制的可擴(kuò)展性,提供主題還支持工作流設(shè)計(jì)器的定制和重復(fù)使用的可能性。在視件工作室內(nèi),開發(fā)者能夠通過導(dǎo)航到工具菜單、選擇選項(xiàng)、選擇工作流設(shè)計(jì)器并選擇主題,來配置哪個(gè)主題當(dāng)前被應(yīng)用于項(xiàng)目。開發(fā)者能夠通過使用“主題”下拉列表,來創(chuàng)建新主題或指定他們希望使用的主題。當(dāng)開發(fā)者選擇“創(chuàng)建新主題”并指定主題文件名時(shí),可以創(chuàng)建新主題。選擇“瀏覽”按鈕可調(diào)用文件對(duì)話框,以搜索主題XML文件。設(shè)計(jì)器下拉列表允許開發(fā)者選擇活動(dòng)分組(基本和合成)、或要主題化的特定活動(dòng)本身??梢栽诤诵慕M處應(yīng)用主題基本(從ActivityDesigner(活動(dòng)設(shè)計(jì)器)中內(nèi)部導(dǎo)出)和合成(從ICompositeActivityDesigner(合成活動(dòng)設(shè)計(jì)器接口)中內(nèi)部導(dǎo)出)。從這些類中的每一個(gè)繼承的設(shè)計(jì)器繼承其主題。但是,用于特定活動(dòng)的設(shè)計(jì)器的每一個(gè)可被個(gè)別地主題化。如果發(fā)生這種情況,那么,顯式活動(dòng)設(shè)計(jì)器主題化優(yōu)先于其繼承的行為。例如,如果ActivityDesigner主題具有藍(lán)色的文本字體顏色,那么,所有這些設(shè)計(jì)器都使用這個(gè)字體顏色。但是,如果主題明確地調(diào)出代碼形狀來將紅色用作字體顏色,那么,所有這些活動(dòng)都顯示藍(lán)色文本字體顏色,除顯示紅色的代碼形狀以外。主題可以定制過程視圖、以及包括進(jìn)度表的活動(dòng)的每一項(xiàng)。大多數(shù)活動(dòng)設(shè)計(jì)器從兩個(gè)類中導(dǎo)出ActivityDesigner和ICompositeActivityDesigner(從ActivityDesigner中導(dǎo)出)。這些是被主題化的元素及其對(duì)應(yīng)的選取器。對(duì)于過程視圖,要被主題化的元素是主題樣式(大/中/小)、示出智能標(biāo)簽(是/否)、示出滾動(dòng)指示器(是/否)、示出放下指示器(是/否)、示出陰影(是/否)、水印(是/否)、前景色(顏色選取器)、背景色(顏色選取器)、示出網(wǎng)格(是/否)、繪制單色(是/否)、示出網(wǎng)格(是/否)、選擇(例如,前景色和圖案顏色)、字體庫(字體選取器)、字體樣式(字體選取器)、繪制圓形(是/否)、內(nèi)容對(duì)齊(近/遠(yuǎn)/中)、示出內(nèi)容(文本、圖標(biāo)、兩者)、示出邊界(是/否)、以及連接器(例如,StartCap(開始帽)和EndCap(結(jié)束帽))。對(duì)于個(gè)別的活動(dòng)設(shè)計(jì)器,以下內(nèi)容能夠被主題化前景色(顏色選取器)、背景色(顏色選取器)、以及邊界(例如,顏色和樣式)。對(duì)于個(gè)別的合成設(shè)計(jì)器,以下內(nèi)容能夠被主題化陰影(是/否)和水印(是/否)。打印預(yù)覽按照與其它應(yīng)用程序相類似的方式,配合引擎設(shè)計(jì)器提供打印預(yù)覽特征。這個(gè)特征改變過程/工作流視圖的可視布局,以反映給定當(dāng)前選中的打印機(jī),將如何打印該進(jìn)度表。從概念上說,打印預(yù)覽是現(xiàn)有過程/工作流視圖上的另一個(gè)視圖。這樣,開發(fā)者仍然能夠執(zhí)行他們所習(xí)慣的全部進(jìn)度表、活動(dòng)和任務(wù)操縱。利用打印預(yù)覽,當(dāng)發(fā)生進(jìn)度表操縱時(shí),開發(fā)者能夠?qū)崟r(shí)地理解打印蘊(yùn)涵。打印整個(gè)過程/工作流視圖(包括智能標(biāo)簽)。通過選擇“打印預(yù)覽”或點(diǎn)擊垂直滾動(dòng)條中的最頂端的圖標(biāo),開發(fā)者可以從文件菜單中調(diào)用打印預(yù)覽。當(dāng)被調(diào)用時(shí),默認(rèn)視圖應(yīng)該是原始視圖的40%。開發(fā)者可以指示各種頁面布局并指定慣例的文檔特征,比如頁邊距、頁眉/頁腳選項(xiàng),并且可以縮放工作流并在需要時(shí)使它對(duì)齊。這些是不可調(diào)整大小的頁面設(shè)置對(duì)話框內(nèi)的兩個(gè)選項(xiàng)卡。第一個(gè)選項(xiàng)卡詳述頁面專用日期。從默認(rèn)打印機(jī)中檢索紙張大小、紙張來源和方位的值。默認(rèn)地,頁邊距是離每個(gè)邊緣1英寸。最后,用于縮放的默認(rèn)值被調(diào)整到標(biāo)準(zhǔn)尺寸的100%。沒有用于在頁面上居中的默認(rèn)值。頁面設(shè)置對(duì)話框的第二個(gè)選項(xiàng)卡處理頁眉和頁腳選項(xiàng)。頁邊距的默認(rèn)值是0.5英寸和居中對(duì)齊。對(duì)于為打印頁面提供頁眉和頁腳的許多其它應(yīng)用程序,文本可以被做成模板。這些默認(rèn)模板選項(xiàng)包括以下內(nèi)容-Page{#}-輸出Page1-Page{#}of{##}-輸出Page1of10-{FullFileName},Page{#}of{##}-輸出C\TestPlan\OEDesignerTestPlan.doc,Page1of10-{FullFileName},Page{#}-輸出C\TestPlan\OEDesignerTestPlan.doc,Page1-{FileName},{Date}{Time},Page{#}-輸出orchestrationenginedesignerTestPlan.doc,04/07/04112,Page1-{FileName},Page{#}of{##}-輸出orchestrationenginedesignerTestPlan.doc,Page1of10-{FileName},Page{#}-輸出orchestrationenginedesignerTestPlan.doc,Page1-Preparedby{User}{Date}-PreparedbyJoeUser04/07/04-{User},Page{#},{Date}-JoeUser,Page1,04/07/04-{custom}-用戶定義這些模板選項(xiàng)可用于頁眉和頁腳。但是,開發(fā)者能夠在“自定義”文本框內(nèi)指定其自己的文本??稍L問性和鍵盤導(dǎo)航配合引擎設(shè)計(jì)器提供按逐項(xiàng)活動(dòng)等級(jí),通過構(gòu)造的已調(diào)度進(jìn)度表來導(dǎo)航的能力。支持以下鍵盤導(dǎo)航-開發(fā)者可以使用上、下、左和右箭頭鍵,來遍歷進(jìn)度表。-合成活動(dòng)可以通過使用“+”鍵來擴(kuò)展,并可以通過使用“-”來層疊。-開發(fā)者能夠通過敲擊Esc鍵而在拖放操作發(fā)生時(shí)取消它。-敲擊Enter鍵具有與雙擊活動(dòng)相同的效果。UI持久化設(shè)計(jì)器提供保存用于以下各個(gè)項(xiàng)的UI配置的能力縮、打印預(yù)覽狀態(tài)、滾動(dòng)條位置、選擇、以及包括合成活動(dòng)的擴(kuò)展或?qū)盈B狀態(tài)的活動(dòng)設(shè)計(jì)器細(xì)節(jié)、作用域和進(jìn)度表的工作流、異常和事件狀態(tài)、約束活動(dòng)組(CAG)編輯或預(yù)覽模式、預(yù)覽活動(dòng)中當(dāng)前運(yùn)行的活動(dòng)(例如,關(guān)于CAG、事件和異常)、以及內(nèi)嵌狀態(tài)。XOML視圖當(dāng)創(chuàng)建進(jìn)度表時(shí),開發(fā)者根本上作用于兩個(gè)單獨(dú)的項(xiàng)工作流(只要需要時(shí),也都可以作為XML來進(jìn)行操縱)的可編輯圖形表示、以及分離代碼(例如,C#或VisualBasic)。該定義可以作為XML或XOML來加以操縱。XOML是進(jìn)度表的XML表示。過程/工作流設(shè)計(jì)器的目的是幫助開發(fā)者迅速生成該XML。開發(fā)者可以在豐富的圖形過程/工作流視圖與基于模式的XML視圖(XOML視圖)之間來回切換。為了完成這一點(diǎn),開發(fā)者可以使用位于工作流設(shè)計(jì)窗口的左下角處的小按鈕,或者通過使用熱鍵F7(用于XOML)和Shift-F7(用于過程/工作流視圖)而在各個(gè)視圖之間轉(zhuǎn)換。XOML編輯器提供智能傳感(IntelliSense)、色化處理、方法技巧和語句完成。開發(fā)者可以通過同時(shí)按Ctrl并按空格鍵,來調(diào)用智能傳感。按照與標(biāo)準(zhǔn)C#/VB編輯器相類似的方式,Xoml視圖提供略述Xoml定義的能力。通過右擊并選擇“略述”上下文菜單,這是可用的。主題屬性為了將主題與活動(dòng)設(shè)計(jì)器相關(guān)聯(lián),活動(dòng)設(shè)計(jì)器需要用ThemeAttribute(主題屬性)來裝飾。利用這個(gè)方法,設(shè)計(jì)器作者可以將主題相關(guān)元數(shù)據(jù)與設(shè)計(jì)器相關(guān)聯(lián)。當(dāng)創(chuàng)建設(shè)計(jì)器時(shí),主題基礎(chǔ)結(jié)構(gòu)獲得該元數(shù)據(jù),并可以在需要時(shí)將它傳遞給設(shè)計(jì)器,以呈現(xiàn)設(shè)計(jì)器可視化。以下是如何將主題屬性與發(fā)送設(shè)計(jì)器相關(guān)聯(lián)的例子。主題屬性類采用兩個(gè)參數(shù)與設(shè)計(jì)器相關(guān)聯(lián)的主題對(duì)象的類型、以及將從其中對(duì)主題對(duì)象進(jìn)行初始化的初始化器XML。初始化器XML是可任選的參數(shù)。表B2.主題屬性類別成員除了將設(shè)計(jì)器主題與設(shè)計(jì)器相關(guān)聯(lián)以外,設(shè)計(jì)器作者還從設(shè)計(jì)器中抽象出可視化數(shù)據(jù)。設(shè)計(jì)器作者創(chuàng)建DesignerTheme(設(shè)計(jì)器主題)導(dǎo)出類,并將所抽象的數(shù)據(jù)放入該類。然后,設(shè)計(jì)器作者可以向?qū)С龅脑O(shè)計(jì)器主題類查詢?cè)谥T如呈現(xiàn)、布局等操作中使用的參數(shù)。DesignerTheme類是需要從其中導(dǎo)出所有設(shè)計(jì)器主題的基類。該類包含所有設(shè)計(jì)器用來參與主題支持的基本信息。DesignerTheme類中的基本數(shù)據(jù)成員如下表B3.DesignerTheme類中的基本數(shù)據(jù)成員以上成員提供個(gè)別的設(shè)計(jì)器與主題的關(guān)聯(lián)。有一些情況,其中,每個(gè)設(shè)計(jì)器需要具有用于呈現(xiàn)其自身的附加信息。這是通過從DesignerTheme類中導(dǎo)出設(shè)計(jì)器專用主題類,并將該特定信息放入該類來完成。ActivityDesignerTheme(活動(dòng)設(shè)計(jì)器主題)類用來描述諸如Send、Receive、Delay等簡(jiǎn)單設(shè)計(jì)器的主題。這些簡(jiǎn)單設(shè)計(jì)器不具有它們之下的其它設(shè)計(jì)器的層級(jí),并且可以基于ActivityDesignerTheme類中的信息來呈現(xiàn)自身。每個(gè)設(shè)計(jì)器具有其自己的初始化器XML;利用該初始化器XML,它對(duì)ActivityDesignerTheme類進(jìn)行初始化,以便呈現(xiàn)自身。以下是使用ActivityDesignerTheme類來描述其所抽象的可視化信息的設(shè)計(jì)器的列表ActivityDesigner(活動(dòng)設(shè)計(jì)器)、CodeDesigner(代碼設(shè)計(jì)器)、CompensateDesigner(補(bǔ)償設(shè)計(jì)器)、DelayDesigner(延遲設(shè)計(jì)器)、FaultDesigner(錯(cuò)誤設(shè)計(jì)器)、InvokeWebServiceDesigner(調(diào)用web服務(wù)設(shè)計(jì)器)、ReceiveDesigner(接收設(shè)計(jì)器)、ReceiveRequestDesigner(接收請(qǐng)求設(shè)計(jì)器)、ReceiveResponseDesigner(接收響應(yīng)設(shè)計(jì)器)、SendDesigner(發(fā)送設(shè)計(jì)器)、SendRequestDesigner(發(fā)送請(qǐng)求設(shè)計(jì)器)、SendResponseDesigner(發(fā)送響應(yīng)設(shè)計(jì)器)、SuspendDesigner(掛起設(shè)計(jì)器)和TerminateDesigner(終止設(shè)計(jì)器)。以下是活動(dòng)設(shè)計(jì)器類的成員表B4.活動(dòng)設(shè)計(jì)器類的成員CompositeDesignerTheme(合成設(shè)計(jì)器主題)類用來抽象諸如Parallel或Sequence等合成設(shè)計(jì)器的可視化信息。該類保持與合成設(shè)計(jì)器中的連接器和頁眉/頁腳的呈現(xiàn)有關(guān)的信息。除ActivityDesignerTheme類的成員以外,CompositeDesignerTheme類還包含以下屬性表B5.合成設(shè)計(jì)器主題類的屬性以下是具有與其相關(guān)聯(lián)的CompositeDesignerTheme的設(shè)計(jì)器的列表CompositeActivityDesigner(合成活動(dòng)設(shè)計(jì)器)、CompensationHandlerDesigner(補(bǔ)償處理程序設(shè)計(jì)器)、ConditionalDesigner(條件設(shè)計(jì)器)、ConditionedDesigner(有條件的設(shè)計(jì)器)、EventDrivenDesigner(事件驅(qū)動(dòng)設(shè)計(jì)器)、EventHandlerDesigner(事件處理程序設(shè)計(jì)器)、ExceptionHandlerDesigner(異常處理程序設(shè)計(jì)器)、CompositeScheduleDesigner(合成進(jìn)度表設(shè)計(jì)器)、ListenDesigner(監(jiān)聽設(shè)計(jì)器)、ParallelDesigner(并行設(shè)計(jì)器)、ScopeDesigner(作用域設(shè)計(jì)器)、SequenceDesigner(順序設(shè)計(jì)器)、GenericTaskDesigner(類屬任務(wù)設(shè)計(jì)器)、WhileDesigner(while設(shè)計(jì)器)。PreviewDesignerTheme(預(yù)覽設(shè)計(jì)器主題)與諸如CAG、ExceptionHandlersDesigner等設(shè)計(jì)器相關(guān)聯(lián),它以項(xiàng)條的形式在它們中顯示子設(shè)計(jì)器的集合。該類包含被用來呈現(xiàn)項(xiàng)條以及其中示出這些項(xiàng)的預(yù)覽窗口的數(shù)據(jù)。除CompositeDesignerTheme類的成員以外,PreviewDesignerTheme類還包含以下屬性表B6.PreviewDesignerTheme類的屬性以下是具有與其相關(guān)聯(lián)的PreviewDesignerTheme的設(shè)計(jì)器的列表ActivityPreviewDesigner(活動(dòng)預(yù)覽設(shè)計(jì)器)、CAGDesigner(CAG設(shè)計(jì)器)、EventHandlersDesigner(事件處理程序設(shè)計(jì)器)和ExceptionHandlersDesigner(異常處理程序設(shè)計(jì)器)。AmbientTheme(環(huán)境主題)類與工作流視圖相關(guān)聯(lián),并包含不僅關(guān)于呈現(xiàn)工作流視圖的信息。該類中所包含的信息與應(yīng)用于所有設(shè)計(jì)器的全局可視化選項(xiàng)有關(guān),諸如,選擇、智能標(biāo)簽、擴(kuò)展按鈕等。除這一點(diǎn)以外,關(guān)于諸如網(wǎng)格、工作流背景、水印等繪制物的信息也被包含在該類中。除DesignerTheme類的成員以外,ServiceRootDesignerTheme(服務(wù)根設(shè)計(jì)器主題)還包含以下屬性。表B7.ServiceRootDesignerTheme的屬性一旦該主題與設(shè)計(jì)器相關(guān)聯(lián),當(dāng)設(shè)計(jì)器正在執(zhí)行布局、呈現(xiàn)或其中需要這些主題參數(shù)的任何其它的活動(dòng)時(shí),設(shè)計(jì)器就使用它。GetDesignerTheme(獲取設(shè)計(jì)器主題)方法將設(shè)計(jì)器類型作為參數(shù)。當(dāng)被調(diào)用時(shí),該方法會(huì)導(dǎo)致Theme類返回與該設(shè)計(jì)器相關(guān)聯(lián)的DesignerTheme導(dǎo)出的主題類。然后,設(shè)計(jì)器可以訪問DesignerTheme導(dǎo)出類中的各種參數(shù),并可以獲得與DesignerTheme類相關(guān)聯(lián)的資源,來呈現(xiàn)該設(shè)計(jì)器。主題類負(fù)責(zé)管理當(dāng)前設(shè)計(jì)器主題、與該主題相關(guān)聯(lián)的資源,并且,當(dāng)用戶更改主題時(shí),也激發(fā)事件。Theme類包含用于管理DesignerThemes的基礎(chǔ)結(jié)構(gòu)。以下是Theme類的功能。-對(duì)DesignerThemes進(jìn)行序列化/解序列化。-在序列化過程期間,報(bào)告錯(cuò)誤。-當(dāng)主題變化時(shí),激發(fā)事件。-管理與不同的設(shè)計(jì)器相關(guān)聯(lián)的DesignerTheme類。-管理主題資源,并擔(dān)當(dāng)為繪制而創(chuàng)建的對(duì)象的高速緩存。-執(zhí)行所包含的DesignerThemes所請(qǐng)求的資源解析。主題類展示以下屬性,以便在設(shè)計(jì)器中啟用主題支持。表B8.Theme類的屬性主題類保持用來呈現(xiàn)活動(dòng)設(shè)計(jì)器的所有設(shè)計(jì)器主題,以允許全局地維護(hù)資源和主題信息??缭骄哂邢嗤^程的不同設(shè)計(jì)器實(shí)例來共享所有這些資源。這防止資源池的耗盡,并提高性能,因?yàn)樵O(shè)計(jì)器不必再創(chuàng)建這些對(duì)象。主題類也展示靜態(tài)ThemeChanged事件。所有這些工作流視圖都監(jiān)聽該事件。當(dāng)用戶更改當(dāng)前主題時(shí),主題類激發(fā)所有工作流視圖所監(jiān)聽的ThemeChanged事件。然后,工作流視圖通過調(diào)用IActivityDesigner.OnThemeChaanged方法,來傳播自身和它們所包含的設(shè)計(jì)器。每個(gè)設(shè)計(jì)器可以覆蓋這個(gè)方法,并可以響應(yīng)于主題變化事件來執(zhí)行自定義動(dòng)作。通過編寫描述參數(shù)的特定主題,用戶可以使設(shè)計(jì)表面的外觀發(fā)生變體,每個(gè)單獨(dú)的設(shè)計(jì)器應(yīng)該遵循這些參數(shù),以便呈現(xiàn)其自身。用戶通過編寫主題文件來完成這一點(diǎn)。主題文件是包含單獨(dú)的設(shè)計(jì)器主題部分的XML文件,這些設(shè)計(jì)器主題部分為每個(gè)設(shè)計(jì)器描述主題參數(shù)。用戶手動(dòng)地創(chuàng)建主題文件,或者,他/她可以使用默認(rèn)UI來創(chuàng)建主題文件。表B9.主題文件格式的構(gòu)造手工編輯XML文件是用于創(chuàng)建主題的一個(gè)方法。用于創(chuàng)建主題的另一個(gè)方法是使用所提供的UI。當(dāng)在視件工作室內(nèi)使用設(shè)計(jì)器時(shí),在工具->選項(xiàng)->工作流設(shè)計(jì)器->主題之下顯示用于定制主題的UI。主題UI是可重新主宿的。如果在視件工作室以外主宿配合引擎設(shè)計(jì)器,那么,用戶可以編寫其自己的對(duì)話框,來主宿主題UI。為了在視件工作室以外重新組塑主題UI,用戶可以使用ThemePage(主題頁)類。主題UI允許用多個(gè)方法來創(chuàng)建主題。用戶可以選擇現(xiàn)有的主題,或者可以選擇現(xiàn)有的主題并修改它們,以創(chuàng)建新的主題。一旦用戶修改主題,他/她就可以通過選擇保存按鈕來將主題保存為不同的主題文件。主題UI在兩種不同的模式中操作;屬性配置和設(shè)計(jì)器預(yù)覽。用戶可以通過使用預(yù)覽模式按鈕而在兩者之間翻轉(zhuǎn)。在屬性配置模式中,用戶可以選擇個(gè)別的設(shè)計(jì)器。當(dāng)從下拉列表中選擇設(shè)計(jì)器時(shí),在屬性瀏覽器中顯示與該設(shè)計(jì)器關(guān)聯(lián)的各個(gè)屬性。用戶可翻轉(zhuǎn)這些屬性來修改設(shè)計(jì)器的外觀。通過翻轉(zhuǎn)到設(shè)計(jì)器預(yù)覽模式,可以查看修改單獨(dú)的屬性的效果。在設(shè)計(jì)器預(yù)覽模式中,在對(duì)話框內(nèi)主存設(shè)計(jì)表面。在存儲(chǔ)器中創(chuàng)建臨時(shí)的活動(dòng)樹,以顯示主題變化對(duì)單獨(dú)的設(shè)計(jì)器的影響。自動(dòng)滾動(dòng)自動(dòng)滾動(dòng)特征允許用戶迅速導(dǎo)航到工作流的任何一部分,同時(shí)執(zhí)行拖放操作或完成自動(dòng)掃視。通過添加自動(dòng)滾動(dòng)指示器,來增強(qiáng)自動(dòng)滾動(dòng)特征。自動(dòng)滾動(dòng)指示器是使用戶能夠理解可以發(fā)生自動(dòng)滾動(dòng)的可能的方向的視覺提示。自動(dòng)滾動(dòng)指示器特征改善了設(shè)計(jì)器的可用性。工作流視圖支持被稱作ShowAutoScrollIndicators(顯示自動(dòng)滾動(dòng)指示器)的屬性,該屬性返回布爾值,以指出何時(shí)需要顯示自動(dòng)滾動(dòng)指示器。工作流視圖包含位圖,以指出可能執(zhí)行滾動(dòng)的方向。在自動(dòng)掃視或拖放事件的情況中,工作流請(qǐng)求其客戶機(jī)區(qū)域的繪畫。響應(yīng)于繪畫請(qǐng)求,它通過覆蓋繪制邏輯來按半透明方式繪制自動(dòng)滾動(dòng)指示器。用戶可能經(jīng)常具有不在視見區(qū)內(nèi)擬合的工作流(在任何時(shí)間點(diǎn),工作流視圖的一部分對(duì)用戶是可見的)。在這一情況下,工作流視圖具有相關(guān)聯(lián)的水平滾動(dòng)條和垂直滾動(dòng)條。這是普通的情形,其中,用戶試圖從工具箱中拖曳新的對(duì)象,并想要放在工作流的不可見的一部分上,或者想要在工作流內(nèi)對(duì)活動(dòng)重新排序。對(duì)于小型工作流,這是可能的,而無須進(jìn)行滾動(dòng);但對(duì)于較大的工作流,當(dāng)用戶想要在視見區(qū)以外放下對(duì)象時(shí),需要滾動(dòng)設(shè)計(jì)器。當(dāng)用戶拖曳鼠標(biāo)并在自動(dòng)滾動(dòng)區(qū)上懸停時(shí),在工作流視圖中實(shí)現(xiàn)的自動(dòng)滾動(dòng)特征使得滾動(dòng)工作流稱為可能。以下是示出如何完成這一點(diǎn)的偽代碼。-對(duì)于每個(gè)拖放消息-如果該消息是拖曳懸停,那么-如果工作流視圖在視見區(qū)內(nèi)擬合-通過沿邊緣采用10%的工作流區(qū)域來計(jì)算自動(dòng)滾動(dòng)區(qū)-如果鼠標(biāo)動(dòng)作中的坐標(biāo)落到自動(dòng)滾動(dòng)區(qū)和工作流視圖滾動(dòng)中-觸發(fā)自動(dòng)滾動(dòng)定時(shí)器-基于自動(dòng)滾動(dòng)區(qū)內(nèi)的鼠標(biāo)位置來遞增或遞減定時(shí)器中的滾動(dòng)位置-否則-停止自動(dòng)滾動(dòng)定時(shí)器拖放連接器裝飾該特征改善拖放操作的可用性。當(dāng)用戶開始拖曳組件時(shí),設(shè)計(jì)器自動(dòng)區(qū)別允許放下所拖曳的組件的連接器。一旦光標(biāo)足夠接近連接器,所拖曳的圖像就咬接到連接器。工作流視圖包含用于在活動(dòng)上添加裝飾的裝飾服務(wù)。在完成所有活動(dòng)的繪制之后,裝飾服務(wù)使活動(dòng)能夠繪制常用的UI圖示符。這保證其它活動(dòng)沒有在任何這圖示符上繪制,從而為圖示符給予特殊處理。當(dāng)前,活動(dòng)支持各種類型的圖示符,包括不充分的配置、選擇、可選擇連接器、斷點(diǎn)等。裝飾服務(wù)類可以被視作工作流試圖的私有助手類。當(dāng)圖示符變?yōu)檫\(yùn)行時(shí),裝飾服務(wù)負(fù)責(zé)按不同的方式來表示圖示符。圖示符可以基于用戶在圖示符上所執(zhí)行的鼠標(biāo)動(dòng)作而變?yōu)檫\(yùn)行,這些包括鼠標(biāo)懸停或鼠標(biāo)點(diǎn)擊。運(yùn)行的圖示符可以基于它是否運(yùn)行來采取不同的動(dòng)作;這些包括示出下拉菜單或觸發(fā)到屬性瀏覽器的導(dǎo)航、觸發(fā)確認(rèn)例程以在活動(dòng)上示出智能標(biāo)簽動(dòng)作圖示符等等。除在活動(dòng)上添加圖示符以外,裝飾服務(wù)也通過使用IPropertyValueUIService(屬性值UI服務(wù)接口)在屬性瀏覽器上添加圖示符。裝飾服務(wù)負(fù)責(zé)將與圖示符相關(guān)聯(lián)的設(shè)計(jì)器動(dòng)作添加到視件工作室IDE的任務(wù)列表。一旦被創(chuàng)建,裝飾服務(wù)就開始監(jiān)聽不同的事件;基于這些事件,活動(dòng)設(shè)計(jì)器可能會(huì)感到需要表示圖示符。這些事件包括ICmponentChangeService(組件改變改變服務(wù)接口)ComponentChanged(組件改變)當(dāng)組件屬性變化時(shí)被觸發(fā)。ComponentAdded(組件添加)當(dāng)添加新的組件時(shí)被觸發(fā)。ComponentRemoved(組件移除)當(dāng)移除組件時(shí)被觸發(fā)。ISelectionService(選擇服務(wù)接口)SelectionChanged(選擇改變)當(dāng)設(shè)計(jì)器中的選擇變化時(shí)被激發(fā)。IPopertyValueUISetvice(屬性值UI服務(wù)接口)AddPropertyValueUIHandler(添加屬性值UI處理程序)當(dāng)屬性瀏覽器中有選擇改變或?qū)傩运⑿聲r(shí)被激發(fā)。ITypeProvider(類型提供者接口)TypesChanged(類型改變)當(dāng)從類型系統(tǒng)中添加/移除新的類型時(shí)被激發(fā)。只要觸發(fā)以上事件中的一個(gè),裝飾服務(wù)就等待下一個(gè)空閑消息。在空閑消息中,裝飾服務(wù)請(qǐng)求活動(dòng)設(shè)計(jì)器更新與圖示符相關(guān)聯(lián)的設(shè)計(jì)器動(dòng)作,并使可查看設(shè)計(jì)器無效。設(shè)計(jì)器動(dòng)作請(qǐng)求觸發(fā)后臺(tái)確認(rèn)。在獲得所更新的設(shè)計(jì)器動(dòng)作之后,裝飾服務(wù)將與所選擇的設(shè)計(jì)器相關(guān)聯(lián)的動(dòng)作放入任務(wù)列表,并且也通過調(diào)用IPropertyValueUIService上的NotifyPropertyValueUIItemsChanged(通知屬性值UI項(xiàng)改變)函數(shù)來向?qū)傩詾g覽器通知變化,該函數(shù)進(jìn)而示出屬性需要屬性瀏覽器中的屬性上的config.Icon。當(dāng)點(diǎn)擊該圖標(biāo)時(shí),觸發(fā)與該屬性項(xiàng)關(guān)聯(lián)的設(shè)計(jì)器動(dòng)作。然后,裝飾服務(wù)通過所有設(shè)計(jì)器,獲得其圖形,并在設(shè)計(jì)器之上繪制圖示符。如果在任何圖示符之上發(fā)生鼠標(biāo)懸?;螯c(diǎn)擊,那么,裝飾服務(wù)激活圖示符,并示出設(shè)計(jì)器動(dòng)作。由活動(dòng)設(shè)計(jì)器返回的所有圖示符從被稱作DesignerGlyph(設(shè)計(jì)器圖示符)的抽象類中導(dǎo)出。該類定義了與這些圖示符中的每一個(gè)有關(guān)的行為。以下是關(guān)于DesignerGlyph類的類定義。以下的表格解釋DesignerGlyph類中的每個(gè)方法及其運(yùn)用。表B10.圖示符方法圖示符可具有或不具有與其相關(guān)聯(lián)的DesignerActions(設(shè)計(jì)器動(dòng)作)。設(shè)計(jì)器動(dòng)作是當(dāng)用戶激活圖示符時(shí)需要執(zhí)行的用戶動(dòng)作集。DesignerAction類用來指出用戶動(dòng)作。從用來顯示菜單項(xiàng)的、被稱作DesignerVerb(設(shè)計(jì)器動(dòng)詞)的類中導(dǎo)出DesignerAction類。DesignerAction也被裝飾服務(wù)用來添加任務(wù)項(xiàng)。以下是設(shè)計(jì)器當(dāng)前出于不同的目的而使用的不同類型的圖示符。表B11.不同類型的圖示符通過裝飾服務(wù)來繪制示出可以接受當(dāng)前拖曳的對(duì)象的連接器的圖標(biāo)。IDesignerService展示屬性“IComponent[]DraggedComponents”,該屬性允許所有活動(dòng)設(shè)計(jì)器訪問所拖曳的對(duì)象,以便依照所有當(dāng)前連接器來測(cè)試它們(一些設(shè)計(jì)器可以允許僅僅落在其連接器的子集上)。當(dāng)通過公用覆蓋DesignerGlyph[]Glyphs方法來向活動(dòng)要求所有裝飾圖示符時(shí),它-通過訪問IDesignerService上的DraggedComponents(拖曳的組件)屬性檢驗(yàn)設(shè)計(jì)表面當(dāng)前是否正處于拖放操作中-對(duì)于每個(gè)連接器-調(diào)用CanInsertActivities()以了解連接器是否將會(huì)允許放下操作-通過DesignerHelpers.IsContextReadOnly()來檢驗(yàn)設(shè)計(jì)器是否不在只讀地點(diǎn)中(調(diào)用進(jìn)度表)-為該連接器創(chuàng)建ConnectorDragDropGlyph(連接器拖放圖示符)的實(shí)例當(dāng)具有拖曳的圖像的光標(biāo)在其中啟用放下的區(qū)域上懸停時(shí),所拖曳的圖像咬接到連接器的中部。-OnDragEnter()和OnDragOver()事件獲得WorkflowDragEventArgs(工作流拖曳時(shí)間自變量)的實(shí)例,作為第一個(gè)參數(shù)-WorkflowDragEventArgs具有屬性publicPointSnapInPoint{},它允許設(shè)計(jì)器指出它們?cè)敢庾屗弦返脑O(shè)計(jì)器咬接到給定點(diǎn)-WorkflowView控制器檢驗(yàn)任何設(shè)計(jì)器是否聲明過所拖曳的圖像,并且-移除圖像的半透明模式-將圖像放置在設(shè)計(jì)器請(qǐng)求的位置中-SequentialActivityDesigner(順序活動(dòng)設(shè)計(jì)器)覆蓋OnDragEnter()和OnDragOver()事件,以指出當(dāng)前放下目標(biāo)的中部(如果它擁有它的話)掃視/縮放工具本發(fā)明包括以下工具放大/縮小”(提高/降低縮放等級(jí),并圍繞點(diǎn)擊的點(diǎn)使視圖居中)、以及掃視(是當(dāng)被點(diǎn)擊時(shí)“抓住”設(shè)計(jì)表面并允許四處拖曳它的手)。由于每個(gè)工具完全覆蓋鼠標(biāo)和鍵盤事件的處理,因此,策略設(shè)計(jì)圖案創(chuàng)建處理所有這些事件的可替換IDesignerMessageFilter(設(shè)計(jì)器消息過濾器接口)對(duì)象。接口IDesignerMessageFilter被定義如下intemalinterfaceIDesignerMessageFilter{CursorCursor{get;}CommandIDCommand{get;}voidOnContextMenu(Pointlocation);voidOnMouseDown(MouseEventArgseventArgs);voidOnMouseMove(MouseEventArgseventArgs);voidOnMouseUp(MouseEventArgseventArgs);voidOnMouseDoubleClick(MouseEventArgseventArgs);voidOnMouseEnter(EventArgse,PointmousePosition);voidOnMouseHover(EventArgse,PointmousePosition);voidOnMouseLeave(EventArgse);voidOnMouseCaptureChanged(EventArgse);voidOnMouseWheel(MouseEventArgseventArgs,KeysmodifierKeys);voidOnDragEnter(DragEventArgsdrgevent);voidOnDragOver(DragEventArgsdrgevent);voidOnDragLeave(EventArgse);voidOnDragDrop(DragEventArgsdrgevent);voidOnGiveFeedback(GiveFeedbackEventArgsgfbevent);voidOnQueryContinueDrag(QueryContinueDragEventArgsqcdevent);voidOnKeyDown(KeyEventArgseventArgs);voidOnKeyUp(KeyEventArgseventArgs);}這些函數(shù)被分成鼠標(biāo)事件處理程序、鍵盤事件處理程序、以及基于消息過濾器及其狀態(tài)來更改工作流視圖光標(biāo)形狀的UpdateCursor()函數(shù)。工作流視圖本身實(shí)現(xiàn)設(shè)計(jì)器消息過濾器的默認(rèn)行為。存在兩個(gè)消息過濾器,用于縮放功能性(對(duì)每一放大和縮小有一個(gè),用戶可以通過按壓Shift鍵而在放大/縮小模式之間轉(zhuǎn)換)和掃視功能。XomlDocumentRootViewXomlWindowPane(XOML窗口窗格)所創(chuàng)建的控件是XomlDocumentRootView(XOML文檔根視圖)。該控件具有垂直滾動(dòng)條和水平滾動(dòng)條。此外,在水平滾動(dòng)條的左側(cè)和垂直滾動(dòng)條的底部有選項(xiàng)卡按鈕。水平滾動(dòng)條上的選項(xiàng)卡按鈕用來顯示多個(gè)視圖的主宿。在第一個(gè)選項(xiàng)卡中,它主宿由surface.GetView()返回的視圖,它是工作流視圖;繼續(xù)到第二個(gè)選項(xiàng)卡,它主宿微軟Xml編輯器。一更改水平滾動(dòng)條中的選項(xiàng)卡,它就激發(fā)適當(dāng)?shù)囊晥D更改事件。它使用IviewCreationService(視圖創(chuàng)建服務(wù)接口)來創(chuàng)建視圖。通過與不同的視圖創(chuàng)建服務(wù)掛鉤,可以添加更多的視圖。以下是IViewCreationService的接口定義publicinterfaceIViewCreationService{//該屬性給出視圖總數(shù)?;谠搶傩缘闹担琗omlDocumentRootView對(duì)象//顯示水平滾動(dòng)條中的選項(xiàng)卡uintViewCount{get;}//該方法基于索引創(chuàng)建視圖。IDesignerViewCreateView(IRootDesignerViewparentView,intindex);//該屬性用于提供與相應(yīng)的索引相關(guān)聯(lián)的圖像。BitmapGetImage(intindex);//該屬性提供與相應(yīng)索引上的視圖相關(guān)聯(lián)的文本。當(dāng)用戶在水平滾動(dòng)條中的//選項(xiàng)卡上方懸停鼠標(biāo)時(shí),對(duì)工具提示示出該文本。stringGetText(intindex);}該服務(wù)的實(shí)現(xiàn)完成以下publicinterfaceIViewCreationService{//該屬性僅返回兩個(gè)視圖。一個(gè)是工作流視圖,另一個(gè)是作為xoml文件的文本//的xoml視圖uintViewCount{get;}//該方法從索引0的DesignSurface獲得工作流視圖,如果存在反序列化錯(cuò)誤,則//作為對(duì)工作流視圖的替代,它返回錯(cuò)誤視圖。對(duì)于索引1,它返回Xoml視圖。IDesignerViewCreateView(IRootDesignerViewparentView,intindex);//它提供與工作流視圖和標(biāo)記視圖相關(guān)聯(lián)的圖標(biāo)。BitmapGetImage(intindex);//該屬性提供與相應(yīng)索引上的視圖相關(guān)聯(lián)的文本。當(dāng)用戶在水平滾動(dòng)條中的//選項(xiàng)卡上方懸停鼠標(biāo)時(shí),對(duì)工具提示示出該文本。stringGetText(intindex);}以該方式創(chuàng)建的每一視圖必須從IDesignerView(設(shè)計(jì)器視圖接口)繼承。以下是IDesignerView的接口定義publicinterfaceIDesignerViewIServiceProvider{//獲取或設(shè)置根視圖對(duì)象IRootDesignerViewRootView{get;set;}//這在用戶按下tab時(shí)調(diào)用,使視圖變?yōu)檫\(yùn)行voidActivate();//當(dāng)用戶按下tab并切換到其它視圖時(shí),則調(diào)用Deactivate()到前一視圖voidDeactivate();//這是在視圖之間進(jìn)行區(qū)分boolIsDesigner{get;}}查看作用域這是當(dāng)被添加到設(shè)計(jì)器時(shí)作用域的默認(rèn)視圖。通過選擇該選項(xiàng),可以將開發(fā)者帶回到該視圖。查看異常通過選擇該選項(xiàng),可以在原地更改UI,以顯示與作用域相關(guān)聯(lián)的異常。當(dāng)事務(wù)類型是長(zhǎng)期運(yùn)行或無時(shí),啟用該選項(xiàng)。換言之,當(dāng)事務(wù)類型是原子時(shí),該菜單不可用。查看事件通過選擇該選項(xiàng),可以在原地更改UI,以顯示與作用域相關(guān)聯(lián)的事件處理程序。查看補(bǔ)償通過選擇該選項(xiàng),可以在原地更改UI,以顯示用作用域來定義的補(bǔ)償。當(dāng)事務(wù)類型屬性被設(shè)置為長(zhǎng)期運(yùn)行或原子時(shí),啟用該選項(xiàng)。其它UI特征為了使工作流在視覺上更吸引人,可以設(shè)置視覺深度,它向顯示在工作流中的活動(dòng)中的每一個(gè)添加陰影。雖然這增加了視覺吸引力,但是,它稍微減緩了用戶交互,因?yàn)楸仨殲楣ぷ髁髦械乃谢顒?dòng)繪制陰影。視覺深度可以從0到4?;谶@個(gè)數(shù)字來決定陰影深度。當(dāng)設(shè)置視覺深度時(shí),每次繪制工作流時(shí),都拍攝其存儲(chǔ)器快照,并將灰度級(jí)變換應(yīng)用于該位圖。然后,該灰度級(jí)位圖在用戶使用視覺深度來指定的偏移量處呈現(xiàn)到圖形對(duì)象上。然后,使存儲(chǔ)器快照的背景變得透明,并在灰度級(jí)位圖之上復(fù)制它。這樣,為工作流提供了3D效果。工作流視圖支持不同的布局,以便可以向用戶呈現(xiàn)工作流的不同表示。該特征也用來示出工作流的打印預(yù)覽。用戶可以在打印預(yù)覽模式中編輯工作流、設(shè)置頁邊距、添加頁眉/頁腳。這允許用戶清楚地知道將如何打印工作流。工作流視圖通過被稱作IWorkflowLayout(工作流布局接口)的接口來主宿多個(gè)布局。該接口使工作流視圖能獲得在繪制不同的布局時(shí)使用的信息,并且也使布局能夠執(zhí)行特定操作,例如,坐標(biāo)變換、縮放和繪制。以下是被實(shí)現(xiàn)來創(chuàng)建新布局的各個(gè)屬性和方法。表B12.用于布局的屬性和方法設(shè)計(jì)器支持默認(rèn)布局和打印預(yù)覽布局。默認(rèn)布局是工作流的簡(jiǎn)單表示。在該布局中,工作流在視見區(qū)中居中,布局決不改變所繪制的工作流的表示。通過在頁面之上繪制工作流,打印預(yù)覽布局顯著地改變工作流的表示。打印預(yù)覽布局從打印文檔和頁面設(shè)置數(shù)據(jù)中獲得數(shù)據(jù),以便計(jì)算頁面大小、縮放和最大范圍,并呈現(xiàn)頁眉/頁腳。打印預(yù)覽布局準(zhǔn)確地描繪將如何在打印機(jī)上打印工作流。在這個(gè)模式中,用戶可以設(shè)置頁邊距、了解將用來顯示頁眉/頁腳的方法、可以在必要時(shí)縮放工作流并對(duì)齊它。打印預(yù)覽布局也使用戶能夠在預(yù)覽的同時(shí)修改工作流。打印預(yù)覽布局將工作流位圖的各個(gè)拼接創(chuàng)建成多個(gè)部分,以便將它們呈現(xiàn)為不同的頁面。當(dāng)用戶開始在工作流視圖上拖曳對(duì)象時(shí),示出拖放指示器。拖放指示器向用戶可視地示出,通過拖放操作,哪個(gè)對(duì)象當(dāng)前正被高速緩存為數(shù)據(jù)對(duì)象。當(dāng)工作流視圖接收拖曳進(jìn)入事件時(shí),它試圖對(duì)所拖曳的組件進(jìn)行反序列化和高速緩存。然后,通過創(chuàng)建臨時(shí)位圖并在其上繪制該組件的圖標(biāo)和描述,該視圖以存儲(chǔ)器位圖的形式創(chuàng)建所拖曳的組件的可視表示。然后,連同鼠標(biāo)光標(biāo)來繪制該存儲(chǔ)器位圖,以指出哪個(gè)對(duì)象正被拖曳。當(dāng)拖曳操作結(jié)束時(shí),工作流視圖毀壞所高速緩存的位圖和組件。工作流視圖支持兩種類型的坐標(biāo)系統(tǒng)。調(diào)用物理坐標(biāo)系統(tǒng)(也由Winforms控件使用)的客戶機(jī)坐標(biāo)系統(tǒng)和邏輯坐標(biāo)系統(tǒng)。在客戶機(jī)坐標(biāo)系統(tǒng)中,控件的左上點(diǎn)是0,0,并且,X和Y坐標(biāo)垂直地和水平地增加;只有當(dāng)滾動(dòng)條不存在時(shí),這個(gè)規(guī)定才是真實(shí)的。當(dāng)滾動(dòng)條存在時(shí),Windows控件的左上部(即0,0)是滾動(dòng)條位置??蛻魴C(jī)坐標(biāo)系統(tǒng)也受到縮放因子的影響。在邏輯坐標(biāo)系統(tǒng)中,每個(gè)對(duì)象總是從0,0映射到m,n,并且,坐標(biāo)不受到滾動(dòng)位置或縮放因子的影響。由工作流中所表示的所有活動(dòng)存儲(chǔ)的坐標(biāo)是邏輯坐標(biāo)的形式。這樣,活動(dòng)不受到滾動(dòng)位置或縮放因子的影響。工作流視圖具有它用來在邏輯坐標(biāo)與客戶機(jī)坐標(biāo)之間變換坐標(biāo)的以下函數(shù)。當(dāng)轉(zhuǎn)換點(diǎn)時(shí),本發(fā)明考慮縮放百分比和滾動(dòng)位置;但當(dāng)轉(zhuǎn)換尺寸時(shí),本發(fā)明只考慮縮放百分比。邏輯-物理變換PointTransformToPhysicalCoOrd(Pointpoint,boolmapToLayout)SizeTransformToPhysicalSize(Sizesize)RectangleTransformToPhysicalViewPort(RectanglelogicalViewPort)物理-邏輯變換PointTranstormToLogicalCoOrd(Pointpoint,boolmapToLayout)SizeTransformToLogicalSize(Sizesize)RectangleTransformToLogicalViewPort(RectanglephysicalViewPort)一旦被創(chuàng)建,工作流視圖就將被稱作IDesignerService的服務(wù)添加到服務(wù)容器?;顒?dòng)設(shè)計(jì)器和其它宿主查詢IDesignerService,以便與工作流視圖和其下的窗口控件進(jìn)行通信。以下是IDesignerService的定義。該接口所支持的屬性、方法和事件被分成兩個(gè)主要類別設(shè)計(jì)表面支持的UI特征,即Zoom、VisualDepth、Printing等;以及Winforms控件特征,它們被展示以便適當(dāng)?shù)爻尸F(xiàn)工作流。表B13.設(shè)計(jì)器服務(wù)屬性工作流視圖模擬用于工作流中的每個(gè)活動(dòng)設(shè)計(jì)器的虛擬窗口控件的行為。該行為意味著,即使活動(dòng)設(shè)計(jì)器不是實(shí)際的窗口控件,工作流視圖也用與Windows控件完全相同的方法來將窗口消息轉(zhuǎn)發(fā)給它們。對(duì)于這一點(diǎn),在每個(gè)鼠標(biāo)消息中,工作流視圖使用集中測(cè)試來找出在鼠標(biāo)光標(biāo)之下的設(shè)計(jì)器,并對(duì)它進(jìn)行緩沖,然后適當(dāng)?shù)剞D(zhuǎn)發(fā)進(jìn)入、懸停、移動(dòng)和離開消息。為了保持哪個(gè)設(shè)計(jì)器在鼠標(biāo)光標(biāo)之下的狀態(tài)和其它重要的鼠標(biāo)信息,工作流視圖使用被稱作MouseEventData(鼠標(biāo)事件數(shù)據(jù))的數(shù)據(jù)結(jié)構(gòu)。MouseEventData結(jié)構(gòu)用來將消息適當(dāng)?shù)芈酚傻交顒?dòng)設(shè)計(jì)器。DesignerData(設(shè)計(jì)器數(shù)據(jù))數(shù)據(jù)結(jié)構(gòu)由工作流視圖用來將與下面的窗口控件有關(guān)的信息傳達(dá)給活動(dòng)設(shè)計(jì)器和布局。該信息在測(cè)量字符串大小和計(jì)算設(shè)計(jì)器大小時(shí)非常重要。ViewportData(視見區(qū)數(shù)據(jù))數(shù)據(jù)結(jié)構(gòu)由工作流視圖用來將與視見區(qū)相關(guān)聯(lián)的信息傳達(dá)給運(yùn)行的布局。信息包括縮放、轉(zhuǎn)換等。HittestData(集中測(cè)試數(shù)據(jù))數(shù)據(jù)結(jié)構(gòu)由工作流視圖用來從活動(dòng)設(shè)計(jì)器中取出集中測(cè)試相關(guān)信息。集中測(cè)試數(shù)據(jù)指出,活動(dòng)設(shè)計(jì)器的哪個(gè)部分被鼠標(biāo)擊中。RenderingHint(呈現(xiàn)提示)數(shù)據(jù)結(jié)構(gòu)由設(shè)計(jì)器用來呈現(xiàn)活動(dòng)設(shè)計(jì)器。呈現(xiàn)提示包括可以用來繪制活動(dòng)設(shè)計(jì)器的顏色、字體、圖標(biāo)和文本相關(guān)繪圖信息。示例性算法用于繪圖的示例性算法包括以下內(nèi)容。-通過在存儲(chǔ)器器中創(chuàng)建位圖在存儲(chǔ)器設(shè)備上下文上繪畫工作流-填充位圖背景-通過調(diào)用根活動(dòng)設(shè)計(jì)器的繪制來繪制所有設(shè)計(jì)器-根活動(dòng)設(shè)計(jì)器遞歸地調(diào)用它以內(nèi)的所有設(shè)計(jì)器上的繪制-在被繪制之前所有設(shè)計(jì)器檢驗(yàn)它們是否在可見區(qū)域內(nèi)-通過調(diào)用裝飾服務(wù)的繪制來繪制裝飾-如果用戶在視見區(qū)上拖曳鼠標(biāo),則繪制拖曳矩形-If用戶設(shè)置了視覺深度,則,-按視覺深度偏移量在原始設(shè)備上下文上繪制位圖-使該位圖透明-在最上層繪制位圖,而無需偏移量-Endif-調(diào)用運(yùn)行布局上的繪制-對(duì)于打印預(yù)覽,通過拼接主要位圖以在此處繪制頁面-對(duì)于默認(rèn)值,直接繪制主要位圖-If用戶處于拖放模式,則,-繪制正拖曳的組件的快照-Endif-If示出放大鏡,則,-繪制放大鏡邊界-將放大區(qū)域映射到被放大的位圖上-將被放大的位圖繪制到放大區(qū)域內(nèi)-Endif用于布局的示例性算法包括以下內(nèi)容。-調(diào)用根設(shè)計(jì)器上的OnLayoutSize-根設(shè)計(jì)器和其它合成設(shè)計(jì)器調(diào)用子設(shè)計(jì)器上的OnLayoutSize-基于子布局,合成設(shè)計(jì)器計(jì)算其大小-調(diào)用根設(shè)計(jì)器上的OnLayoutPosition-根設(shè)計(jì)器和其它合成設(shè)計(jì)器調(diào)用子設(shè)計(jì)器上的OnLayoutPosition-設(shè)計(jì)器基于其父設(shè)計(jì)器的位置來設(shè)置位置-調(diào)用運(yùn)行布局的更新-布局更新它們中呈現(xiàn)布局所需要的數(shù)據(jù)結(jié)構(gòu)-更新根設(shè)計(jì)器位置,以便按布局所請(qǐng)求的來適當(dāng)?shù)貙?duì)齊根設(shè)計(jì)器-基于使用根設(shè)計(jì)器來計(jì)算范圍的運(yùn)行布局范圍,來更新滾動(dòng)條的滾動(dòng)范圍用于事件轉(zhuǎn)發(fā)的示例性算法包括以下內(nèi)容。-For所有鼠標(biāo)事件-檢驗(yàn)其上發(fā)生過該事件的設(shè)計(jì)器-使用IActivityDesigner接口將離開事件轉(zhuǎn)發(fā)到較早的設(shè)計(jì)器-使用IActivityDesigner接口將進(jìn)入/懸停事件轉(zhuǎn)發(fā)到其上發(fā)生該事件的當(dāng)前設(shè)計(jì)器-緩沖當(dāng)前設(shè)計(jì)器,并等待下一個(gè)事件-Endfor用于刪除的示例性算法包括以下內(nèi)容。-通過使用ISelectionService(選擇服務(wù)接口)來獲得當(dāng)前選擇的設(shè)計(jì)器-獲得與設(shè)計(jì)器相關(guān)聯(lián)的所有頂層活動(dòng)。這是因?yàn)橛脩艨梢詧?zhí)行多次選擇并可以選擇父設(shè)計(jì)器和子設(shè)計(jì)器并按壓刪除-For所有頂層活動(dòng)-獲得每個(gè)頂層活動(dòng)的父設(shè)計(jì)器-如果具有子活動(dòng)的父設(shè)計(jì)器上的CanRemoveActivity(能夠移除活動(dòng))返回真-調(diào)用具有子活動(dòng)的父設(shè)計(jì)器上的RemoveActivity(移除活動(dòng))-Endif-Endfor-獲得被移除的最后一項(xiàng)活動(dòng)的父設(shè)計(jì)器并選擇它。工作流設(shè)計(jì)器鍵盤和命令路由設(shè)計(jì)器將服務(wù)IMenuCommandService(菜單命令服務(wù)接口)用于命令路由。實(shí)現(xiàn)該服務(wù)是宿主的責(zé)任。類型CommanSet(命令集)包含支持的命令的平面列表(CommandSetItem(命令集項(xiàng)一從System.ComponentModel.Design.MenuCommand中導(dǎo)出)。每個(gè)命令包含CommandID(命令I(lǐng)D)(由組ID和項(xiàng)ID組成)、用于執(zhí)行該命令的處理程序、以及用于查詢其狀態(tài)(被啟用、可見等)的處理程序;一旦被創(chuàng)建,就使用IMenuCommandService.AddCommand()來將命令注入服務(wù)。通過主宿應(yīng)用程序(VS、Zamm)或者在某些情況中通過工作流視圖,向CommandID解釋UI提示(鍵盤、鼠標(biāo)操作、菜單命令)。例如當(dāng)選擇項(xiàng)部菜單項(xiàng)時(shí),由宿主來調(diào)用適當(dāng)?shù)拿?。但是,工作流視圖在被聚焦時(shí)處理鼠標(biāo)操作和鍵盤。此外,作為與單獨(dú)的設(shè)計(jì)器相關(guān)聯(lián)的特殊命令的DesignerVerbs(設(shè)計(jì)器動(dòng)詞)在活動(dòng)設(shè)計(jì)器中聲明,并由IMenuCommandService自動(dòng)收集。表B14.CommandSet類表B15.CommandSetItem類只要更改選擇(通過ISelectionService來跟蹤),就評(píng)估命令狀態(tài)。為了始終獲得當(dāng)前狀態(tài),使用ImmidiateCommandSetItem(立即命令集項(xiàng))(從CommandSetItem中導(dǎo)出),而不是CommandSetItem(命令集項(xiàng))。打印IDesignerService接口上的類WorkflowPrintDocument(工作流打印文檔)和公用屬性PrintDocument(打印文檔)支持打印。WorkflowPrintDocument本身保持對(duì)通過其來創(chuàng)建它的工作流視圖的引用,以執(zhí)行實(shí)際的繪制。由于打印機(jī)的分辨率不同于屏幕分辨率,因此,在開始實(shí)際的打印之前,打印文檔使用打印機(jī)圖形來重新布局工作流、打印所有頁面、然后要求工作流視圖再次使用屏幕分辨率來執(zhí)行布局?;顒?dòng)設(shè)計(jì)器接口IActivityDesigner接口由需要參與工作流的所有活動(dòng)設(shè)計(jì)器來實(shí)現(xiàn)。這是設(shè)計(jì)器用來與其它設(shè)計(jì)器和工作流視圖交談的協(xié)議。工作流視圖尋找IActivityDesigner接口,以便向設(shè)計(jì)器呈現(xiàn)、布局或轉(zhuǎn)發(fā)事件。通過支持IActivityDesigner接口,使所有設(shè)計(jì)器能夠表現(xiàn)得象窗口控件,即使設(shè)計(jì)器實(shí)際上不是從窗口控件中導(dǎo)出的。該接口也使工作流視圖和其它設(shè)計(jì)器基礎(chǔ)結(jié)構(gòu)(比如裝飾服務(wù)、菜單命令服務(wù))能夠與設(shè)計(jì)器交換信息。從IActivityDesigner接口中導(dǎo)出的設(shè)計(jì)器可能不具有層級(jí);為了具有層級(jí),設(shè)計(jì)器需要實(shí)現(xiàn)ICompositeActivityDesigner接口。以下是IActivityDesigner的定義,具有關(guān)于屬性和方法的細(xì)節(jié)。表B16.IActivity設(shè)計(jì)器的屬性和方法ICompositeActivityDesignerICompositeActivityDesigner由可在其之下具有層級(jí)的設(shè)計(jì)器來實(shí)現(xiàn);即,它們可具有子設(shè)計(jì)器。合成設(shè)計(jì)器負(fù)責(zé)保持自身和所有其子設(shè)計(jì)器。通過使用ICompositeActivityDesigner接口,合成設(shè)計(jì)器分發(fā)關(guān)于其子設(shè)計(jì)器的信息、提供用于添加和移除子設(shè)計(jì)器的功能、并啟用鍵盤導(dǎo)航。以下是ICompositeActivityDesiener的定義,具有關(guān)于屬性和方法的細(xì)節(jié)。表B17.ICompositeActivityDesigner的屬性和方法簡(jiǎn)單設(shè)計(jì)器ActivityDesigner(活動(dòng)設(shè)計(jì)器)類表示設(shè)計(jì)器最簡(jiǎn)單的實(shí)現(xiàn)。與工作流中的活動(dòng)相關(guān)聯(lián)的所有設(shè)計(jì)器是從ActivityDesigner中導(dǎo)出的。ActivityDesigner類從IActivityDesigner接口繼承,并且為該接口提供默認(rèn)的實(shí)現(xiàn)。工作流視圖使用IActivityDesigner接口與設(shè)計(jì)器談話。ActivityDesigner類一般由需要用于設(shè)計(jì)器繪制的非常輕量的實(shí)現(xiàn)的設(shè)計(jì)器繼承。這些設(shè)計(jì)器沒有任何子對(duì)象或者分層結(jié)構(gòu)。由活動(dòng)設(shè)計(jì)器提供的特征包括基于布局邏輯、呈現(xiàn)支持(例如,通過繪制圖標(biāo)、描述、邊框、內(nèi)部和背景)、呈現(xiàn)幫助文本、返回所有設(shè)計(jì)器需要的默認(rèn)字形、通過DesignerVerb(設(shè)計(jì)器動(dòng)詞)顯示上下文菜單、過濾設(shè)計(jì)時(shí)專用屬性、默認(rèn)事件生成、默認(rèn)擊中測(cè)試、觸發(fā)確認(rèn)、顯示工具提示、以及參加鍵盤導(dǎo)航。publicabstractclassActivityDesignerComponentDesigner,IActivityDesignerSystem.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.CodeDesignerSystem.Workflow.ComponentModel.Design.CompensateDesignerSystem.Workflow.ComponentModel.Design.DelayDesignerSystem.Workflow.ComponentModel.Design.FaultDesignerSystem.Workflow.ComponentModel.Design.CompositeScheduleDesignerSystem.Workflow.ComponentModel.Design.InvokeWebServiceDesignerSystem.Workflow.ComponentModel.Design.BaseReceiveDesignerSystem.Workflow.ComponentModel.6Design.BaseSendDesignerSystem.Workflow.ComponentModel.Design.GenericTaskDesignerSystem.Workflow.ComponentModel.Design.STSTaskDesigner合成設(shè)計(jì)器CompositeActivityDesigner是具有分層結(jié)構(gòu)的設(shè)計(jì)器(例如,在它們之下具有子對(duì)象)。CompositeActivityDesigner負(fù)責(zé)管理它自己及其子對(duì)象的所有方面。它也負(fù)責(zé)與其子對(duì)象交互以轉(zhuǎn)發(fā)事件。只要有修改CompositeActivityDesigner所包含的活動(dòng)設(shè)計(jì)器集合的請(qǐng)求;它就傳遞一個(gè)上下文(ContextBase(上下文基)),該上下文指定一個(gè)位置,需要將活動(dòng)從這個(gè)位置移除。ContextBase可由每個(gè)CompositeActivityDesigner導(dǎo)出類專門化,以指定專用于它們的上下文。它的例子是SequentialActivityDesigner(順序活動(dòng)設(shè)計(jì)器),通過從ContextBase導(dǎo)出一個(gè)稱為ConnectorContext(連接器上下文)的類來專門化ContextBase。CompositeActivityDesigner從ICompositeActivityDesigner接口導(dǎo)出,并且為它提供默認(rèn)的實(shí)現(xiàn)。由CompositeActivityDesigner提供的特征包括展開層折疊設(shè)計(jì)器、拖放指示符、布局本身和子對(duì)象、繪制本身和子對(duì)象、子對(duì)象的擊中測(cè)試、以及從分層結(jié)構(gòu)插入移除活動(dòng)。publicabstractclassCompositeActivityDesignerActivityDesigner,ICompositeActivityDesignerSystem.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.SequentialActivityDesign1erSysrem.Workflow.ComponentModel.Design.ParallelActivityDesignerSystem.Workflow.ComponentModel.Design.ConstrainedActivityDesignerCompositeActivityDesigner是抽象類并且不能被實(shí)例化,因?yàn)樗荒茉谄渥陨砩洗嬖凇m樞?、并行和CA設(shè)計(jì)器都是這個(gè)類的專門化。SequentialActivityDesigner(順序活動(dòng)設(shè)計(jì)器)SequentialActivityDesigner類表示在其下具有子對(duì)象且所有子對(duì)象是順序排序的所有設(shè)計(jì)器。子對(duì)象通過稱為連接器的鏈接來連接,連接器還用于修改子對(duì)象的順序。SequentialActivityDesigner類是CompositeActivityDesigner的專門化,并且提供下列特征集連接器開始和結(jié)束位圖繪制、順序地布局所有子對(duì)象并且更新鏈接它們的所有連接器、在子對(duì)象之間繪制連接器、在拖放發(fā)生時(shí)高亮放置區(qū)域、擊中測(cè)試連接器、使用上下箭頭鍵的順序鍵盤導(dǎo)航、以及為連接器返回字形。intemalabstractclassSequentialActivityDesignerCompositeActivityDesignerSystem.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.SequentialActivityDesignerSystem.Workflow.........Design.ActivityPreviewDesignerSystem.Workflow.........Design.CompensationHandlerDesignerSystem.Workflow.........Design.ConditionedDesignerSystem.Workflow.........Design.EventHandlerDesignerSystem.Workflow.........Design.ExceptionHandlerDesignerSystem.Workflow.........Design.ScopeDesignerSystem.Workflow.........Design.SequenceDesignerSystem.Workflow.........Design.WhileDesigner所有上述設(shè)計(jì)器是SequentialActivityDesigner的專門化;它們?nèi)恐饕诶L制方面不同。所有這些設(shè)計(jì)器具有一種特殊的方法以在工作流上表示它們自己,但它們?nèi)肯擞蒘equentialActivityDesigner提供的共同功能。ParallelActivityDesigner(并行活動(dòng)設(shè)計(jì)器)ParallelActivityDesigner是CompositeActivityDesigner的另一個(gè)專門化,它包含多個(gè)SequentialActivityDesigner。這些SequentialActivityDesigner的每一個(gè)是并行設(shè)計(jì)器中的一個(gè)分支。并行設(shè)計(jì)器提供下列專門化的特征布局多個(gè)順序設(shè)計(jì)器、拖放用于添加附加的分支的指示符、使左右箭頭鍵在并行分支之間遍歷的鍵盤導(dǎo)航、以及繪制連接器以鏈接多個(gè)并行分支。intemalabstractclassParallelActivityDesignerCompositeActivityDesigner\System.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.ParallelActivityDesignerSystem.Workflow.........ConditionalDesignerSystem.Workflow.........ListenDesignerSystem.Workflow.........ParallelDesignerConditional、Listen和Parrallel設(shè)計(jì)器是ParallelActivityDesigner的專門化,具有與它們相關(guān)聯(lián)的附加繪制邏輯。ActivityPreviewDesigner(活動(dòng)預(yù)覽設(shè)計(jì)器)ActivityPreviewDesigner是順序設(shè)計(jì)器,但具有以集合袋(collectionbag)形式顯示多個(gè)設(shè)計(jì)器的集合的能力。ActivityPreviewDesigner使用幻燈片的比喻來顯示這個(gè)集合。當(dāng)一個(gè)特定的設(shè)計(jì)器被選中時(shí),其表示在活動(dòng)預(yù)覽設(shè)計(jì)器所主宿的預(yù)覽窗口中顯示。ActivityPreviewDesigner具有兩種模式編輯模式和預(yù)覽模式。在預(yù)覽模式中,用戶不能修改已選中的設(shè)計(jì)器。該模式使用戶能夠看見設(shè)計(jì)器的整個(gè)表示而不必滾動(dòng)。編輯模式允許設(shè)計(jì)器被修改。由ActivityPreviewDesigner提供的特征包括預(yù)覽條帶以顯示活動(dòng)的集合、預(yù)覽當(dāng)前選中的活動(dòng)、以及編輯所選中的設(shè)計(jì)器的能力。internalabstractclassActivityPreviewDesignerSequentialActivityDesignerSystem.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.SequentialActivityDesignerSystem.Workflow.........Design.ActivityPreviewDesignerSystem.Workflow.........Design.GenericCollectionDesignerSystem.Workflow.........Design.CAGDesignerScope(作用域)和Service(服務(wù))設(shè)計(jì)器Scope和Service設(shè)計(jì)器是特殊的設(shè)計(jì)器。其每一個(gè)可具有與它們相關(guān)聯(lián)的異常、事件和補(bǔ)償。Scope和Service在用戶代碼文件中還具有與它們相關(guān)聯(lián)的類,并且用戶具有將變量限制在這些類中的能力。Scope和Service設(shè)計(jì)器被示出為不同與其它設(shè)計(jì)器,并且顯示水印和通過繪制陰影來高亮它們。Scope和Service設(shè)計(jì)器具有改變視圖的能力,因此用戶可翻轉(zhuǎn)視圖來揭示與它們相關(guān)聯(lián)的異常、事件和補(bǔ)償。當(dāng)用戶在Service或Scope圖標(biāo)上懸停時(shí),出現(xiàn)一個(gè)下拉選項(xiàng)板,它使用戶能夠選取異常、事件或補(bǔ)償視圖之一。設(shè)計(jì)器視圖隨后被翻轉(zhuǎn),并且顯示包含在所選中的視圖中的活動(dòng)。用戶可在任何時(shí)間點(diǎn)只查看屬于任何一個(gè)視圖的活動(dòng)。視圖的翻轉(zhuǎn)是通過過濾包含在Scope或者Schedule中的子活動(dòng)來完成的。Scope和Schedule可具有ExceptionHandler、EventHandlers和Compensate中的最多一個(gè)作為它的子對(duì)象?;谟脩粲^看的視圖;設(shè)計(jì)器過濾掉這些子對(duì)象,以只顯示可出現(xiàn)在所選中的視圖中的子活動(dòng);因而實(shí)現(xiàn)支持多視圖的效果。Schedule設(shè)計(jì)器通常被設(shè)置為工作流視圖中的根設(shè)計(jì)器。internalclassScopeDesignerSequentialActivityDesignerinternalclassServiceDesignerScopeDesignerSystem.ObjectSystem.ComponentModel.Design.ComponentDesignerSystem.Workflow.ComponentModel.Design.ActivityDesignerSystem.Workflow.ComponentModel.Design.CompositeActivityDesignerSystem.Workflow.ComponentModel.Design.SequentialActivityDesignerSystem.Workflow.........Design.ScopeDesignerSystem.Workflow.........Design.ServiceDesignerServiceRootDesigner(服務(wù)根設(shè)計(jì)器)ServiceRootDesigner與由設(shè)計(jì)器宿主所包含的根組件相關(guān)聯(lián)。它負(fù)責(zé)創(chuàng)建隨后要主宿在設(shè)計(jì)器窗口窗格中的工作流視圖。ServiceRootDesigner還支持IToolBoxUser(工具箱用戶接口)接口,它給予通過在工具箱項(xiàng)上雙擊來添加工具箱項(xiàng)的能力。Design-timeDescriptors(設(shè)計(jì)時(shí)描述符)創(chuàng)作對(duì)象模型中的每個(gè)活動(dòng)具有描述其在設(shè)計(jì)時(shí)期間行為的元數(shù)據(jù)。這包括關(guān)聯(lián)活動(dòng)(設(shè)計(jì)器)以及屬性網(wǎng)格行為(命名、描述、過濾、屬性編輯器等)。類型\屬性\事件設(shè)計(jì)時(shí)行為是使用零個(gè)或多個(gè)下列元屬性來描述的-SRCategoryAttribute(SR類別元屬性)-配合引擎元屬性。提供本地化的類別名。-SRDescriptionAttribute(SR描述元屬性)-配合引擎元屬性。提供本地化的描述。-EditorAttribute(編輯器元屬性)-提供UITypeEditor(UI類型編輯器).-TypeConverter(類型轉(zhuǎn)換器)-提供過濾、值列表以及類型之間的轉(zhuǎn)換。-BrowsableAtrribute(可瀏覽屬性)-在設(shè)計(jì)時(shí)顯示/隱藏成員。SRCategory(SR類別)和SRDescription(SR描述)只是資源名字與串之間的映射。大多數(shù)編輯器(UITypeEditor)是用于處理對(duì)話框(像CorrelationSetsDialog(相關(guān)性設(shè)置對(duì)話框))或者下拉列表的管理器。PropertyDescriptor(屬性描述符)處理設(shè)計(jì)時(shí)的屬性,并且由默認(rèn)的TypeConverter、自定義的TypeConverter(它是如上被聲明為元屬性的)或者TypeDescriptor(類型描述符)中任一個(gè)來向其傳遞屬性。UI類型編輯器為配合引擎組件模型中的各屬性提供編輯器。屬性瀏覽器使用它們顯示省略號(hào)或者下拉并且用于起動(dòng)編輯器。TvpeConverters(類型轉(zhuǎn)換器)類型轉(zhuǎn)換器提供將對(duì)象轉(zhuǎn)換到其它類型/從其它類型轉(zhuǎn)換到對(duì)象的方法、提供表示設(shè)計(jì)時(shí)的對(duì)象屬性的PropertyDescriptor列表、并且可能提供要屬性網(wǎng)格的屬性下拉中使用的值。下面是在配合引擎組件模型中實(shí)現(xiàn)的某些TypeConverter-DeclTypeConverter(聲明類型轉(zhuǎn)換器)基類到所有活動(dòng)的類型轉(zhuǎn)換器。實(shí)現(xiàn)CanConvertFrom()、CanConvertTo()、ConvertFrom()、ConvertTo(),它們將活動(dòng)對(duì)象轉(zhuǎn)換成串/從串轉(zhuǎn)換成活動(dòng)對(duì)象(以顯示屬性網(wǎng)格中活動(dòng)的名字,并且允許名字編輯以創(chuàng)建活動(dòng))。而且,GetSite()提供對(duì)服務(wù)的訪問。-HandlerDeclTypeConverter(處理程序聲明類型轉(zhuǎn)換器)事件的類型轉(zhuǎn)換器。從DeclTypeConverter導(dǎo)出。實(shí)現(xiàn)GetStandardValues(),它使用IEventBindingService(事件綁定服務(wù)接口)來顯示兼容的處理程序。-VariableDeclTypeConverter(變量聲明類型轉(zhuǎn)換器)變量(消息、通道、相關(guān)性等)的類型轉(zhuǎn)換器。從DeclTypeConverter導(dǎo)出。實(shí)現(xiàn)GetStandardValues(),它使用IFieldBindingService(字段綁定服務(wù)接口)來顯示兼容的變量字段。另外,類型轉(zhuǎn)換器過濾掉“Name(名字)”屬性,并且為表現(xiàn)為類屬類型的類型屬性設(shè)置一個(gè)特殊的屬性描述符。屬性描述符屬性描述符為活動(dòng)對(duì)象提供設(shè)計(jì)時(shí)服務(wù)。它提供名字、描述、類別、類型轉(zhuǎn)換器信息,并在獲得/設(shè)置屬性時(shí)提供附加功能。默認(rèn)地,TypeConverter將為所有屬性提供PropertyDescriptor。然而,TypeConverter可移除、添加或者包裝它們以提供類型的不同設(shè)計(jì)時(shí)行為。下面是創(chuàng)作對(duì)象模型中實(shí)現(xiàn)的某些PropertyDescriptor-DynamicPropertyDescriptor(動(dòng)態(tài)屬性描述符)創(chuàng)作對(duì)象模型中所有屬性描述符的基類。實(shí)現(xiàn)默認(rèn)屬性描述符的包裝器,并且將所有方法委托給它。另外,提供直接從對(duì)象(如果它是組件)或者通過IReferenceService(引用服務(wù)接口)對(duì)于對(duì)象站點(diǎn)的訪問。-VariableDeclPropertyDescriptor(變量聲明屬性描述符)所有變量(消息、通道、相關(guān)性等)的屬性描述符。重載SetValue()以提供如下的代碼分離字段-獲得要設(shè)置的變量及其站點(diǎn)。-獲得包含作用域的站點(diǎn)。-獲得包含作用域的IEventBindingService。注意,每個(gè)作用域具有它自己的IEventBindingService以及它自己的字段集。-用服務(wù)確認(rèn)字段名。-打開設(shè)計(jì)器事務(wù)。-保存值。-調(diào)用IFieldBindingService.CreateField(),將該字段添加到代碼分離文件。-提交事務(wù)。-HandlerDeclPropertyDescriptor(處理程序聲明屬性描述符)所有處理程序的屬性描述符。重載SetValue()以提供如下的代碼分離字段-獲得要設(shè)置的HandlerDeclaration(處理程序聲明)對(duì)象及其站點(diǎn)。-獲得IEventBindingService。-打開設(shè)計(jì)器事務(wù)。-創(chuàng)建LocalEventDescriptor(本地事件描述符)。-獲得事件的PropertyDescriptor(使用eventBindingService.GetEventProperty())并且在其上設(shè)置HandlerDeclaration。-設(shè)置HandlerDeclaration對(duì)象的“Name(名字)”屬性。-提交事務(wù)。-ArrayElementPropertyDescriptor(數(shù)組元素屬性描述符)表示集合中一個(gè)項(xiàng)的屬性描述符。由于-例如相關(guān)性設(shè)置等集合項(xiàng)沒有屬性描述符(它們不是屬性),因此ArrayElementPropertyDescriptor偽造描述符,如同它們是屬性一樣,因而允許在屬性瀏覽器內(nèi)顯示它們。這個(gè)屬性描述符被設(shè)計(jì)成由任何上述屬性描述符來包裝。-LocalEventDescriptor(本地事件描述符)用于表示HandlerDeclaration的EventDescriptor(事件描述符)。創(chuàng)作對(duì)象模型中的處理程序不是真的事件,而是屬性,因此引入自己的EventDescriptor用于要使用的IEventBindingService。使用ICustomTvpeDescriptor(自定義類型描述符接口)ICustomTypeDescriptor是設(shè)置組件描述符的另一種方法。組件本身實(shí)現(xiàn)該接口并且提供描述符,如類型轉(zhuǎn)換器、默認(rèn)值等等。GenericActivity(類屬活動(dòng))、InvokeWebServiceActivity調(diào)用web服務(wù)活動(dòng))和InvokeSchedule(調(diào)用進(jìn)度表)實(shí)現(xiàn)這個(gè)接口。使用IExtenderProvider(擴(kuò)展器供應(yīng)者接口)這是向組件引入設(shè)計(jì)時(shí)屬性的又一種技術(shù)。擴(kuò)展類RulePropertyProviderExtender(規(guī)則屬性供應(yīng)者擴(kuò)展器)向ServiceDesigner(服務(wù)設(shè)計(jì)器)提供規(guī)則屬性。通過經(jīng)由ProvidePropertyAttribute(提供屬性元屬性)裝飾擴(kuò)展器類、實(shí)現(xiàn)元屬性的取值器和置值器、以及將擴(kuò)展器類添加到可通過組件的站點(diǎn)(Schedule.Site)訪問的IExtenderProviderService(擴(kuò)展器供應(yīng)者服務(wù)接口)類(在此例中,由RulePropertyProviderExtender實(shí)現(xiàn))來添加屬性??蓴U(kuò)展性支持System.Workflow.ComponentModel.Design名字空間為用戶提供各種可重用的類,以在創(chuàng)建它們自己的活動(dòng)設(shè)計(jì)器并且將它們插入到配合引擎設(shè)計(jì)器之中時(shí)使用。下面是用戶可使用的類的列表。-ActivityDesigner(活動(dòng)設(shè)計(jì)器)ActivityDesigner給予用戶添加在其下沒有其它活動(dòng)的分層結(jié)構(gòu)的簡(jiǎn)單活動(dòng)的能力。用戶需要從這個(gè)設(shè)計(jì)器繼承并且可定制位圖、描述和繪制。-SequentialActivityDesigner(順序活動(dòng)設(shè)計(jì)器)SequentialActivityDesigner使用戶能夠編寫可在其中包含多個(gè)活動(dòng)的設(shè)計(jì)器。所有這些活動(dòng)被順序地排列,并且使用連接器線來鏈接。用戶可從這個(gè)類導(dǎo)出,并且提供白定義的著色、描述、圖標(biāo)等。-ParallelActivityDesigner(并行活動(dòng)設(shè)計(jì)器)ParallelActivityDesigner使用戶能夠編寫可在其中具有多個(gè)合成活動(dòng)并且以并行方式排列它們的活動(dòng)設(shè)計(jì)器。該類還使用戶能夠定制描述、圖標(biāo)、顏色等。該類可通過繼承來擴(kuò)展。-OrchestrationEngineToolboxltem(配合引擎工具箱項(xiàng))OrchestrationEngineToolboxItem使用戶能夠創(chuàng)建自定義的工具箱項(xiàng)。該類給予用戶控制序列化的能力。該類提供掛鉤,使用掛鉤,用戶可在活動(dòng)被添加到設(shè)計(jì)器中時(shí)彈出自定義的UI。用戶可通過繼承重用該類。用戶需要通過使用ToolBoxItem(工具箱項(xiàng))元屬性來提供工具箱項(xiàng)。-TypeBrowserEditor(類型瀏覽器編輯器)TypeBrowserEditor使用戶能夠?yàn)g覽設(shè)計(jì)器中可用的類型。該類是通過將它與類型為System.Type的屬性相關(guān)聯(lián)來使用的。用戶使用UITypeEditor(UI類型編輯器)元屬性來將該類與屬性相關(guān)聯(lián)。-TypeConverter(類型轉(zhuǎn)換器)類配合引擎組件模型提供各種類型轉(zhuǎn)換器,它們使用戶能夠定義他們自己的類型轉(zhuǎn)換器。通過繼承來擴(kuò)展類型轉(zhuǎn)換器,可使用所有類型轉(zhuǎn)換器。-DesignerGlyph(設(shè)計(jì)器字形)DesignerGlyph類可由用戶用于在設(shè)計(jì)器之上繪制自定義的字形。用戶可能想要顯示需要在Z順序的最頂上繪制的某些可視字形。DesignerGlyph類可用于繪制這類字形。可通過繼承擴(kuò)展這個(gè)類來使用它。-DesignerAction(設(shè)計(jì)器動(dòng)作)用戶可將DesignerAction與DesignerGlyph相關(guān)聯(lián)。當(dāng)用戶在DesignerGlyph上點(diǎn)擊時(shí)顯示這些動(dòng)作。自定義的設(shè)計(jì)器動(dòng)作可通過從DesignerAction類繼承來創(chuàng)建。權(quán)利要求1.一種用于對(duì)工作流建模的系統(tǒng),所述工作流包括活動(dòng)(430),所述工作流對(duì)商業(yè)過程建模,所述系統(tǒng)包括存儲(chǔ)區(qū)域(428),用于存儲(chǔ)多項(xiàng)活動(dòng)(430);顯示區(qū)域(404),用于顯示被存儲(chǔ)在所述存儲(chǔ)區(qū)域(428)內(nèi)的多項(xiàng)活動(dòng)(430);處理器(408),它被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令,用于從用戶(402)接收對(duì)活動(dòng)(430)的選擇;在所述顯示區(qū)域(404)內(nèi)顯示所接收的活動(dòng)(430)的選擇;從用戶(402)那里接收結(jié)構(gòu)信息;以及根據(jù)所接收的結(jié)構(gòu)信息在所述顯示區(qū)域(404)內(nèi)排列所顯示的活動(dòng)(430)的選擇,以創(chuàng)建工作流。2.如權(quán)利要求1所述的系統(tǒng),其特征在于,還包括定點(diǎn)設(shè)備,并且其中,所述存儲(chǔ)區(qū)域(428)存儲(chǔ)被排列來創(chuàng)建工作流的多個(gè)圖形元素(432),所述多個(gè)圖形元素(432)經(jīng)由所述顯示區(qū)域(404)和所述定點(diǎn)設(shè)備從用戶(402)接收),并且,所述存儲(chǔ)區(qū)域(428)還存儲(chǔ)多個(gè)選項(xiàng)板元素(434),其每一個(gè)對(duì)應(yīng)于所述多項(xiàng)活動(dòng)(430)中的至少一項(xiàng)。3.如權(quán)利要求1-2所述的系統(tǒng),其特征在于,所述處理器(408)還被配置成執(zhí)行以下計(jì)算機(jī)可執(zhí)行指令將存儲(chǔ)在所述存儲(chǔ)區(qū)域(428)內(nèi)的圖形元素(432)中的每一個(gè)映射到所述多個(gè)選項(xiàng)板元素(434)之一;根據(jù)所映射的選項(xiàng)板元素創(chuàng)建所述工作流;以及,在所述顯示區(qū)域(404)上顯示所述工作流。4.如權(quán)利要求1-3所述的系統(tǒng),其特征在于,它還包括用于以下的一項(xiàng)或多項(xiàng)的裝置顯示所述多項(xiàng)活動(dòng)(430)、接收所述活動(dòng)(430)的選擇、從用戶(402)接收所述結(jié)構(gòu)信息、以及根據(jù)所接收的結(jié)構(gòu)信息來排列所顯示的活動(dòng)(430)的選擇以創(chuàng)建工作流。5.如權(quán)利要求1-4所述的系統(tǒng),其特征在于,還包括包含所述顯示區(qū)域(404)的顯示設(shè)備(404),并且還包括與所述處理器(408)一起操作的用戶界面選擇設(shè)備(406)。6.如權(quán)利要求1-5所述的系統(tǒng),其特征在于,所述處理器(408)包括用于從用戶(402)接收所述多個(gè)圖形元素(432),并根據(jù)其來創(chuàng)建工作流的裝置,其中,所述顯示區(qū)域(404)包括用戶界面,其中,所述顯示區(qū)域(404)適用于在應(yīng)用程序的執(zhí)行環(huán)境內(nèi)顯示。7.在具有顯示器(404)和用戶界面選擇設(shè)備(406)的計(jì)算機(jī)系統(tǒng)中,一種用于對(duì)工作流建模的方法,所述工作流包括活動(dòng),所述工作流對(duì)商業(yè)過程建模,所述計(jì)算機(jī)化方法包括在所述顯示器(404)上顯示多項(xiàng)活動(dòng);經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收對(duì)活動(dòng)(430)的選擇;在所述顯示器(404)上顯示所接收的活動(dòng)(430)的選擇;經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收結(jié)構(gòu)信息;以及根據(jù)所接收的結(jié)構(gòu)信息在所述顯示器(404)上排列所顯示的活動(dòng)(430)的選擇,以創(chuàng)建工作流。8.如權(quán)利要求7所述的計(jì)算機(jī)化方法,其特征在于,還包括定義多個(gè)選項(xiàng)板元素(434),所定義的多個(gè)選項(xiàng)板元素(434)中的每一個(gè)對(duì)應(yīng)于所述多項(xiàng)活動(dòng)(430)中的至少一項(xiàng)。9.如權(quán)利要求7-8所述的計(jì)算機(jī)化方法,其特征在于,還包括經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收定制信息,并且根據(jù)所接收的定制信息調(diào)整所顯示的多項(xiàng)活動(dòng)(430)。10.如權(quán)利要求7-9所述的計(jì)算機(jī)化方法,其特征在于,還包括經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收商業(yè)邏輯,用于與所述活動(dòng)(430)之一相關(guān)聯(lián)。11.如權(quán)利要求7-10所述的計(jì)算機(jī)化方法,其特征在于,還包括經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收用戶定義活動(dòng),其中,所述用戶定義活動(dòng)具有與其相關(guān)聯(lián)的一個(gè)或多個(gè)語義,并且所述方法還包括評(píng)估所述語義,以找出與預(yù)定義的接口要求的一致性;并且根據(jù)所述評(píng)估將所述用戶定義活動(dòng)存儲(chǔ)為所述活動(dòng)之一。12.如權(quán)利要求7-11所述的計(jì)算機(jī)化方法,其特征在于,還包括接收將所創(chuàng)建的工作流轉(zhuǎn)換成用戶指定的語言的命令。13.權(quán)利要求7-12所述的計(jì)算機(jī)化方法,其特征在于,還包括經(jīng)由觸摸屏(436)從用戶(402)接收以下的一項(xiàng)或多項(xiàng)對(duì)所顯示的工作流的編輯、對(duì)所述工作流的注釋、對(duì)所排列、顯示的活動(dòng)選擇的糾正。14.在具有顯示器(404)和用戶界面選擇設(shè)備(406)的計(jì)算機(jī)系統(tǒng)中,一個(gè)或多個(gè)具有用于對(duì)工作流建模的計(jì)算機(jī)可執(zhí)行組件的計(jì)算機(jī)可讀介質(zhì)(410),所述工作流包括活動(dòng)(430),所述工作流對(duì)商業(yè)過程建模,所述計(jì)算機(jī)可執(zhí)行組件包括呈現(xiàn)組件(412),用于在所述顯示器(404)上顯示多項(xiàng)活動(dòng)(430);接口組件(414),用于經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收所述呈現(xiàn)部件(412)顯示的活動(dòng)(430)的選擇,所述呈現(xiàn)組件(412)還在所述顯示器(404)上顯示所述接口組件(414)所接收的活動(dòng)(430)的選擇,所述接口組件(414)還經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶(402)接收結(jié)構(gòu)信息;以及設(shè)計(jì)器組件(416),用于根據(jù)所接收的結(jié)構(gòu)信息在所述顯示器(404)上排列所述活動(dòng)(430)的選擇,以創(chuàng)建工作流。15.如權(quán)利要求14所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于,還包括用于定義多個(gè)選項(xiàng)板元素(434)的選項(xiàng)板組件(422),所定義的多個(gè)選項(xiàng)板元素(434)中的每一個(gè)對(duì)應(yīng)于所述多項(xiàng)活動(dòng)(43)中的至少一項(xiàng),其中,所述接口部件(414)經(jīng)由所述界面選擇設(shè)備(406)從用戶(402)接收多個(gè)圖形元素(432),所接收的多個(gè)圖形元素(432)對(duì)應(yīng)于顯示在所述顯示器(404)上的活動(dòng)(430)的選擇,并且排列所述活動(dòng)(430)的選擇以創(chuàng)建工作流。16.如權(quán)利要求14-15所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于,還包括識(shí)別器組件(420),用于將所述接口部件(414)所接收的多個(gè)圖形元素(432)中的每一個(gè)與所述選項(xiàng)板組件(422)所定義的選項(xiàng)板元素(434)之一相關(guān)聯(lián),并且排列所關(guān)聯(lián)的選項(xiàng)板元素(434),以便在所述顯示器(404)上顯示所述工作流。17.如權(quán)利要求14-16所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于,所述接口組件(414)還經(jīng)由所述用戶界面選擇設(shè)備(406)從用戶接收用戶定義活動(dòng),所述用戶定義活動(dòng)具有與其相關(guān)聯(lián)的一個(gè)或多個(gè)語義,并且所述計(jì)算機(jī)可讀介質(zhì)還包括確認(rèn)組件(418),用于評(píng)估所述語義,以找出與預(yù)定義的接口要求的一致性。18.如權(quán)利要求14-17所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于,所述呈現(xiàn)組件(412)還根據(jù)所述確認(rèn)組件(418),在所述顯示器(404)上將所接收的用戶定義活動(dòng)顯示為所述多項(xiàng)活動(dòng)(430)之一,其中,所述接口組件(414)還接收與所述活動(dòng)(430)之一相關(guān)聯(lián)的商業(yè)邏輯,其中,所述呈現(xiàn)組件(412)、接口組件(414)和設(shè)計(jì)器組件(416)在應(yīng)用程序的執(zhí)行環(huán)境內(nèi)執(zhí)行,并且其中,所述接口組件(414)包括以下的一項(xiàng)或多項(xiàng)圖形用戶界面和應(yīng)用程序編程接口。19.如權(quán)利要求14-18所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于,所述顯示器(404)包括觸摸屏(436),并且其中,所述接口組件(414)將所述商業(yè)邏輯與對(duì)應(yīng)于所述工作流中的所排列的選項(xiàng)板元素之一的活動(dòng)(430)之一相關(guān)聯(lián)。20.如權(quán)利要求14-19所述的計(jì)算機(jī)可讀介質(zhì)(410),其特征在于還包括皮膚組件(424),用于將用戶定義主題應(yīng)用于顯示在所述觸摸屏(436)上的工作流,并且還包括工作流組件(426),用于根據(jù)所述識(shí)別器組件(420)所排列的相關(guān)聯(lián)的選項(xiàng)板元素來創(chuàng)建所述工作流。全文摘要一種用于構(gòu)建組件化的工作流模型的用戶界面。工作流的每一步驟被建模為具有元數(shù)據(jù)的活動(dòng),該元數(shù)據(jù)描述該工作流步驟的設(shè)計(jì)時(shí)方面、編譯時(shí)方面以及運(yùn)行時(shí)方面。用戶通過該用戶界面選擇并安排活動(dòng)來創(chuàng)建工作流。收集與工作流中每一活動(dòng)相關(guān)聯(lián)的元數(shù)據(jù)來創(chuàng)建工作流的持久表示。用戶通過創(chuàng)作自定義活動(dòng)來擴(kuò)展工作流模型。文檔編號(hào)G06F3/033GK101013362SQ20051009909公開日2007年8月8日申請(qǐng)日期2005年9月1日優(yōu)先權(quán)日2004年10月1日發(fā)明者D·K·舒克拉,D·皮拉瑞諾斯,S·觸,A·V·帕拉斯尼斯,M·梅達(dá),E·希斯戴,A·G·班達(dá)卡,A·J·薩加申請(qǐng)人:微軟公司