轉(zhuǎn):
http://blog.csdn.net/dotnetWalker/archive/2010/03/31/5438704.aspx
Silverlight 3這個(gè)版本剛釋出時(shí),讓人感到驚艷的新功能很多,但要說哪一項(xiàng)技術(shù)可以徹底改變和提升開發(fā)人員與設(shè)計(jì)師之間的合作方式,并且能夠達(dá)成真正的模塊化并且提高程序代碼重用性,對(duì)于Silvelright應(yīng)用程序(或網(wǎng)站)的開發(fā)有著決定性的關(guān)鍵影響,那非Behavior技術(shù)莫屬了。
幾乎我的所有朋友(和客戶們),對(duì)于Silverlight加入這個(gè)新功能無不大加贊許,它一舉解決了過去designer(設(shè)計(jì)師或美術(shù)人員)和developer(程序設(shè)計(jì)師)長(zhǎng)期的合作與溝通問題,找出了一個(gè)可以讓設(shè)計(jì)師和開發(fā)人員好好溝通并且互相配合的方式(這部分是Behavior對(duì)于Designer的價(jià)值);同時(shí),這個(gè)技術(shù)也提供了另一種系統(tǒng)開發(fā)的可能性,讓不具備高度程序開發(fā)技術(shù)的開發(fā)人員,也可以撰寫出自己需要的系統(tǒng),并且讓軟件重用性大幅提升(這部分則是Behavior對(duì)于Developer的價(jià)值)。
Behavior可以把一些常用的行為封裝成可重復(fù)使用的組件(Component),這個(gè)組件從技術(shù)面來說,當(dāng)然只是沒有外觀的一組類別(Class),而開發(fā)人員或設(shè)計(jì)師可以在Blend 3當(dāng)中將這個(gè)類別的對(duì)象實(shí)體(instance)『套用(Hook)』到某一個(gè)控件上,使得套用了該Behavior的控件可以不須撰寫任何程序代碼,就可以立即擁有(達(dá)成)一些和使用者互動(dòng)的行為。
例如說,當(dāng)我們把『撥放動(dòng)畫』這一個(gè)Behavior套用在Button這個(gè)對(duì)象上之后,當(dāng)用戶點(diǎn)選(Click)Button,則動(dòng)畫就自動(dòng)被撥放了,不用寫程序,使用起來就跟拖曳控件一樣自然。這讓設(shè)計(jì)師(Designer)有機(jī)會(huì)可以獨(dú)立的建置Silvelright應(yīng)用程序,一掃過去設(shè)計(jì)師必須時(shí)時(shí)刻刻依賴開發(fā)人員而無法獨(dú)立運(yùn)作的窘境。
這也讓我們有機(jī)會(huì)把『行為』對(duì)象化。請(qǐng)注意,在傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計(jì)觀念中,過去我們只把UI層的需求組件化成為控件,而現(xiàn)在我們則可以進(jìn)一步地把實(shí)現(xiàn)(達(dá)成)特定功能的代碼段,例如發(fā)一封信、撥一段動(dòng)畫、將窗體上的數(shù)據(jù)存入數(shù)據(jù)庫…等『動(dòng)作』,也組件化成為『行為』(其實(shí)上在Silverlight中有Action和Behavior這兩種實(shí)現(xiàn)方式可供選擇,容后說明)。
如此一來,除了設(shè)計(jì)師之外,若開發(fā)人員擅用Behavior機(jī)制也將可以讓整個(gè)Silverlight應(yīng)用程序的設(shè)計(jì)更加的結(jié)構(gòu)化與對(duì)象化,我們可以把常用的『動(dòng)作』封裝起來重復(fù)使用,由資深程序設(shè)計(jì)師來設(shè)計(jì)Behavior,而初階或是UI的程序設(shè)計(jì)師則負(fù)責(zé)使用這些Behavior來開發(fā)程序。
在理想狀況下,Designer(設(shè)計(jì)師)或domain expert(特定領(lǐng)域的專家,例如財(cái)會(huì)人員、HR人員、或MIS)甚至可以完全不需要具備程序設(shè)計(jì)的觀念,只需要了解基礎(chǔ)的事件(Event)觀念,就可以順利的開發(fā)出一套系統(tǒng),若需要實(shí)現(xiàn)特定的功能時(shí),可商請(qǐng)developere為他們開發(fā)所需要的Behavior,designer只需要取得這些Behavior并使用即可。
理想狀況離現(xiàn)實(shí)很遙遠(yuǎn)嗎?一點(diǎn)也不,依據(jù)我實(shí)際針對(duì)企業(yè)講授Silverlight課程的經(jīng)驗(yàn)來看,Behaivor幾乎擄獲所有Designer和domain expert的心,甚至我們幾乎可以期待這樣的概念衍生到Windows Form/Web Form的應(yīng)用程序開發(fā)當(dāng)中。
OK,說了這么多,我們還是先來看看該怎么在開發(fā)環(huán)境當(dāng)中使用Behavior技術(shù)。當(dāng)然,就單純的Silverlight開發(fā)人員(不管是Designer或是Developer)來說,開發(fā)環(huán)境安裝好Blend 3是最低的要求,同時(shí)當(dāng)您安裝了Silverlight 3 SDK以及Blend 3 SDK、Silverlight 3 Toolkit等套件之后,您可以直接在Blend 3當(dāng)中建立一個(gè)Silverlight應(yīng)用程序,接著在場(chǎng)景中布置一個(gè)Button和一個(gè)TextBlock,并且隨意設(shè)計(jì)一個(gè)動(dòng)畫。
接著,請(qǐng)切換到Assets頁標(biāo)簽,若您有正確的安裝Blend 3 SDK,您會(huì)看到Assets頁卷標(biāo)下有Behaviors選項(xiàng),在列出的項(xiàng)目中,你會(huì)看到有一個(gè)ControlStoryboardAction:
請(qǐng)點(diǎn)選它并拖曳到Button上,然后切換到Object and Timeline頁標(biāo)簽,您會(huì)發(fā)現(xiàn)Button控件底下多了個(gè)ControlStoryboardAction對(duì)象
接著點(diǎn)選該對(duì)象,切換到屬性窗口,您接著會(huì)發(fā)現(xiàn),可以透過開發(fā)環(huán)境來設(shè)定ControlStoryboardAction對(duì)象的屬性(請(qǐng)注意不是Button的屬性,別點(diǎn)錯(cuò)):
完成之后,請(qǐng)先建置(Build)此應(yīng)用程序,成功后請(qǐng)接著執(zhí)行此應(yīng)用程序,您會(huì)發(fā)現(xiàn)在不需要寫任何程序代碼的狀況下,當(dāng)使用者按下Button1(也就是Button1的Click事件觸發(fā)后),Storyboard動(dòng)畫就自動(dòng)被播放了。
如果您仔細(xì)觀察Action的設(shè)定窗口,會(huì)發(fā)現(xiàn)其實(shí)場(chǎng)景中任何控件(不只是Button)的任何事件(不只是Click)都可以做為特定Action的觸發(fā)條件。而每一個(gè)Actionr都代表著一種行為,而程序設(shè)計(jì)人員(developer)可以設(shè)計(jì)出各式各樣的Action,讓設(shè)計(jì)師(Designer)直接使用。
那Trigger、Action、Behavior三者之間究竟有何關(guān)系呢?
從上面的操作中我們可以知道,Action是經(jīng)過程序設(shè)計(jì)師封裝好的某種行為(功能),我們可以把一些常用的代碼段,例如上面用到的『動(dòng)畫撥放』、或是先前我們提過的『發(fā)一封信』、或『將窗體上的數(shù)據(jù)存入數(shù)據(jù)庫』…等『功能』整理成一個(gè)個(gè)的Action,而開發(fā)人員只需要把Action拖曳到特定的對(duì)象上即可使用。
當(dāng)然,拖曳到目標(biāo)對(duì)象上之后,還得要設(shè)定這個(gè)Action的相關(guān)信息,也就是該Action的屬性(如果有的話),以及該Action被觸發(fā)的時(shí)機(jī),而這就是所謂的Trigger了。
在Silverlight中,預(yù)設(shè)的Trigger有底下幾種:
1.EventTrigger:最常用的觸發(fā)器,可選擇在控件的特定事件發(fā)生時(shí)觸發(fā),例如Loaded、MouseLeftButtonDown、GotFocus…等。
2.TimerTrigger:可設(shè)定每n毫秒觸發(fā)一次,總共要觸發(fā)幾次或隨時(shí)間持續(xù)觸發(fā)。
3.KeyTrigger:可設(shè)定在特定按鍵被按下時(shí)觸發(fā),可捕捉到鍵盤上的一般按鍵與功能鍵,亦可抓取Ctrl, Alt等組合控制鍵。
4.StoryboardCompletedTrigger:在特定動(dòng)畫撥放完畢后觸發(fā)。
請(qǐng)注意,這些Trigger是配合著Action使用的,你會(huì)發(fā)現(xiàn),每一個(gè)Action都可以透過Blend設(shè)定Trigger,并透過Trigger來觸發(fā)執(zhí)行此Action,如此一來,我們就可以相當(dāng)靈活的在場(chǎng)景中特定控件的特定事件發(fā)生時(shí),來執(zhí)行特定工作。
也就是說,在這個(gè)機(jī)制下,只要程序設(shè)計(jì)師預(yù)先寫好Trigger與Action,Designer就可以在完全不撰寫任何程序代碼的狀況下,來開發(fā)出一個(gè)Silverlight應(yīng)用系統(tǒng)或網(wǎng)站。
我們剛才提到了Action與Trigger,那Behavior呢?難道Behavior不需要Trigger嗎?其實(shí)不是的,應(yīng)該說,Behavior是內(nèi)建(包含)了Trigger!!!
你會(huì)發(fā)現(xiàn)當(dāng)場(chǎng)景中的某一個(gè)對(duì)象被套用了Behavior之后,不需要設(shè)定任何Trigger,該對(duì)象就會(huì)自動(dòng)擁有某種功能,就好像我們剛才介紹了的MouseDragElementBehavior一樣,當(dāng)該Behavior套用在某個(gè)對(duì)象上,該對(duì)象就直接支持拖曳行為了,因此,你可以將Behavior直接想象成Trigeer與Action的結(jié)合。
我們先談到這邊,下一篇?jiǎng)t要來介紹Action的開發(fā)方式...
從前面的介紹中我們可以知道,當(dāng)我們?cè)O(shè)計(jì)好了Action或Behavior之后,其實(shí)不僅是設(shè)計(jì)師(Designer)可以使用,一般開發(fā)人員在撰寫應(yīng)用程序時(shí),也可以將常用的功能封裝成了Action或Behavior,讓其他開發(fā)人員直接套用。
我們?cè)谶@邊看一個(gè)簡(jiǎn)單的例子,從這個(gè)例子當(dāng)中我們也來看如何設(shè)計(jì)Action。請(qǐng)參考底下這個(gè)畫面:
這是一個(gè)很典型的簡(jiǎn)單輸入畫面,使用者可以在TextBox中輸入文字,但是,當(dāng)用戶點(diǎn)選TextBox的時(shí)候,得先把TextBox中的文字先清空后才能輸入,體貼一點(diǎn)的程序,會(huì)在用戶點(diǎn)選該TextBox時(shí),就直接讓該TextBox中的文字變成『選取』狀態(tài),這樣使用者就可以直接輸入了:
當(dāng)然,要達(dá)成這樣的功能相當(dāng)容易,只需要在TextBox的GotFocus事件中撰寫『this.TextBox1.SelectAll();』即可。但是每一個(gè)TextBox都要這樣寫,顯然很麻煩,如果可以跟剛才一樣,把一個(gè)對(duì)象(Component)直接拖曳到TextBox上,該TextBox就自動(dòng)具有此功能,豈不挺好?
是的,我們緊接著就來看如何設(shè)計(jì)這樣的Action。
請(qǐng)先建立一個(gè)Silverlight項(xiàng)目(當(dāng)然您也可以在現(xiàn)有的Silverlight項(xiàng)目中直接建立Action或Behavior類別,不過為Action或Behavior建立一個(gè)獨(dú)立的項(xiàng)目是比較理想的選擇),該項(xiàng)目請(qǐng)選擇『Silverlight Class Library』即可,接著,請(qǐng)?jiān)谠擁?xiàng)目中建立一個(gè)Action類別,當(dāng)您在項(xiàng)目中選擇Add New Item時(shí),可以找到Blend分類下的Action Template,我們建立一個(gè)名稱為『TextBoxAutoSelectAction』的Action,你會(huì)發(fā)現(xiàn)建立出來的類別如下:
請(qǐng)將TriggerAction調(diào)整成TargetedTriggerAction,并將<DependencyObject>改為< TextBox >。
TargetedTriggerAction是一個(gè)泛型類別,其中的<DependencyObject>則可設(shè)定為我們默認(rèn)的目標(biāo)對(duì)象。例如,我們現(xiàn)在設(shè)計(jì)的這個(gè)TextBoxAction主要的使用對(duì)象是TextBox,因此我們可以寫成『TargetedTriggerAction<TextBox>』。而繼承TargetedTriggerAction這個(gè)類別必須要實(shí)作Invoke方法,Invoke方法是該Action被觸發(fā)時(shí),要執(zhí)行的動(dòng)作。
接著,我們?cè)贗nvoke方法中撰寫的程序代碼如下:
其中的Target是目標(biāo)對(duì)象,也就是我們將來把該Action拖曳到TextBox時(shí)所指定的控件,而我們針對(duì)該Target呼叫其SelectAll()方法,來選取其中的文字。就這樣,完成了。
接著我們編譯建置該項(xiàng)目,然后在我們的Silverlight主項(xiàng)目當(dāng)中,引用(Add Reference)建置好的.dll,
當(dāng)項(xiàng)目中正確的引用了該.dll之后,就可以開始使用了,請(qǐng)切換到Blend 3,依照剛才我們先前介紹如何使用Action的方式,切換到Assets頁標(biāo)簽下,您會(huì)看到我們剛才建立的這個(gè)Action已經(jīng)出現(xiàn)在選項(xiàng)當(dāng)中(如果沒有找到,請(qǐng)檢查一下是否有正確的引用該.dll或是該項(xiàng)目)。這時(shí)候,您可以直接將該Action (TextBoxAutoSelectAction)拖曳到畫面中的TextBox上:
拖曳上去之后,切換到屬性窗口,可以設(shè)定該Action的屬性:
請(qǐng)將Trigger中的EventName設(shè)定為GotFocus,接著將TargetName設(shè)為TextBox1,整個(gè)設(shè)定的意思是:當(dāng)TextBox1的GotFocus事件被觸發(fā)時(shí),在TextBox對(duì)象上(將TextBox1對(duì)象視為Target)執(zhí)行該Action(也就是讓TextBox中的文字被選取)。
經(jīng)過這樣的設(shè)定后,應(yīng)用程序執(zhí)行時(shí)只要用戶一點(diǎn)選TextBox1或是透過Tab鍵切換到TextBox1(GotFocus事件被觸發(fā)),TextBox中的文字就自動(dòng)被選取了。未來我們只需要把這個(gè)Behavior拖曳到任何TextBox對(duì)象上,就可以不須撰寫任何程序代碼,在需要的時(shí)候執(zhí)行此Action。
盡管這個(gè)范例似乎很簡(jiǎn)單(只是選取文字),但重點(diǎn)是透過這樣的技術(shù),開發(fā)人員可以利用此機(jī)制,或設(shè)計(jì)出各式各樣的Action,供其他Developer或Designer使用,諸如影片的控制(播放、暫停)、甚至是各種窗口或是動(dòng)畫的處理(例如對(duì)象的淡入淡出…)。總括來說,Action是一個(gè)相當(dāng)好用且重要的功能,值得開發(fā)人員廣泛的使用在自己的項(xiàng)目當(dāng)中。
Silverlight 3這個(gè)版本剛釋出時(shí),讓人感到驚艷的新功能很多,但要說哪一項(xiàng)技術(shù)可以徹底改變和提升開發(fā)人員與設(shè)計(jì)師之間的合作方式,并且能夠達(dá)成真正的模塊化并且提高程序代碼重用性,對(duì)于Silvelright應(yīng)用程序(或網(wǎng)站)的開發(fā)有著決定性的關(guān)鍵影響,那非Behavior技術(shù)莫屬了。
幾乎我的所有朋友(和客戶們),對(duì)于Silverlight加入這個(gè)新功能無不大加贊許,它一舉解決了過去designer(設(shè)計(jì)師或美術(shù)人員)和developer(程序設(shè)計(jì)師)長(zhǎng)期的合作與溝通問題,找出了一個(gè)可以讓設(shè)計(jì)師和開發(fā)人員好好溝通并且互相配合的方式(這部分是Behavior對(duì)于Designer的價(jià)值);同時(shí),這個(gè)技術(shù)也提供了另一種系統(tǒng)開發(fā)的可能性,讓不具備高度程序開發(fā)技術(shù)的開發(fā)人員,也可以撰寫出自己需要的系統(tǒng),并且讓軟件重用性大幅提升(這部分則是Behavior對(duì)于Developer的價(jià)值)。
Behavior可以把一些常用的行為封裝成可重復(fù)使用的組件(Component),這個(gè)組件從技術(shù)面來說,當(dāng)然只是沒有外觀的一組類別(Class),而開發(fā)人員或設(shè)計(jì)師可以在Blend 3當(dāng)中將這個(gè)類別的對(duì)象實(shí)體(instance)『套用(Hook)』到某一個(gè)控件上,使得套用了該Behavior的控件可以不須撰寫任何程序代碼,就可以立即擁有(達(dá)成)一些和使用者互動(dòng)的行為。
例如說,當(dāng)我們把『撥放動(dòng)畫』這一個(gè)Behavior套用在Button這個(gè)對(duì)象上之后,當(dāng)用戶點(diǎn)選(Click)Button,則動(dòng)畫就自動(dòng)被撥放了,不用寫程序,使用起來就跟拖曳控件一樣自然。這讓設(shè)計(jì)師(Designer)有機(jī)會(huì)可以獨(dú)立的建置Silvelright應(yīng)用程序,一掃過去設(shè)計(jì)師必須時(shí)時(shí)刻刻依賴開發(fā)人員而無法獨(dú)立運(yùn)作的窘境。
這也讓我們有機(jī)會(huì)把『行為』對(duì)象化。請(qǐng)注意,在傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計(jì)觀念中,過去我們只把UI層的需求組件化成為控件,而現(xiàn)在我們則可以進(jìn)一步地把實(shí)現(xiàn)(達(dá)成)特定功能的代碼段,例如發(fā)一封信、撥一段動(dòng)畫、將窗體上的數(shù)據(jù)存入數(shù)據(jù)庫…等『動(dòng)作』,也組件化成為『行為』(其實(shí)上在Silverlight中有Action和Behavior這兩種實(shí)現(xiàn)方式可供選擇,容后說明)。
如此一來,除了設(shè)計(jì)師之外,若開發(fā)人員擅用Behavior機(jī)制也將可以讓整個(gè)Silverlight應(yīng)用程序的設(shè)計(jì)更加的結(jié)構(gòu)化與對(duì)象化,我們可以把常用的『動(dòng)作』封裝起來重復(fù)使用,由資深程序設(shè)計(jì)師來設(shè)計(jì)Behavior,而初階或是UI的程序設(shè)計(jì)師則負(fù)責(zé)使用這些Behavior來開發(fā)程序。
在理想狀況下,Designer(設(shè)計(jì)師)或domain expert(特定領(lǐng)域的專家,例如財(cái)會(huì)人員、HR人員、或MIS)甚至可以完全不需要具備程序設(shè)計(jì)的觀念,只需要了解基礎(chǔ)的事件(Event)觀念,就可以順利的開發(fā)出一套系統(tǒng),若需要實(shí)現(xiàn)特定的功能時(shí),可商請(qǐng)developere為他們開發(fā)所需要的Behavior,designer只需要取得這些Behavior并使用即可。
理想狀況離現(xiàn)實(shí)很遙遠(yuǎn)嗎?一點(diǎn)也不,依據(jù)我實(shí)際針對(duì)企業(yè)講授Silverlight課程的經(jīng)驗(yàn)來看,Behaivor幾乎擄獲所有Designer和domain expert的心,甚至我們幾乎可以期待這樣的概念衍生到Windows Form/Web Form的應(yīng)用程序開發(fā)當(dāng)中。
OK,說了這么多,我們還是先來看看該怎么在開發(fā)環(huán)境當(dāng)中使用Behavior技術(shù)。當(dāng)然,就單純的Silverlight開發(fā)人員(不管是Designer或是Developer)來說,開發(fā)環(huán)境安裝好Blend 3是最低的要求,同時(shí)當(dāng)您安裝了Silverlight 3 SDK以及Blend 3 SDK、Silverlight 3 Toolkit等套件之后,您可以直接在Blend 3當(dāng)中建立一個(gè)Silverlight應(yīng)用程序,接著在場(chǎng)景中布置一個(gè)Button和一個(gè)TextBlock,并且隨意設(shè)計(jì)一個(gè)動(dòng)畫。
接著,請(qǐng)切換到Assets頁標(biāo)簽,若您有正確的安裝Blend 3 SDK,您會(huì)看到Assets頁卷標(biāo)下有Behaviors選項(xiàng),在列出的項(xiàng)目中,你會(huì)看到有一個(gè)ControlStoryboardAction:

請(qǐng)點(diǎn)選它并拖曳到Button上,然后切換到Object and Timeline頁標(biāo)簽,您會(huì)發(fā)現(xiàn)Button控件底下多了個(gè)ControlStoryboardAction對(duì)象

接著點(diǎn)選該對(duì)象,切換到屬性窗口,您接著會(huì)發(fā)現(xiàn),可以透過開發(fā)環(huán)境來設(shè)定ControlStoryboardAction對(duì)象的屬性(請(qǐng)注意不是Button的屬性,別點(diǎn)錯(cuò)):

完成之后,請(qǐng)先建置(Build)此應(yīng)用程序,成功后請(qǐng)接著執(zhí)行此應(yīng)用程序,您會(huì)發(fā)現(xiàn)在不需要寫任何程序代碼的狀況下,當(dāng)使用者按下Button1(也就是Button1的Click事件觸發(fā)后),Storyboard動(dòng)畫就自動(dòng)被播放了。
如果您仔細(xì)觀察Action的設(shè)定窗口,會(huì)發(fā)現(xiàn)其實(shí)場(chǎng)景中任何控件(不只是Button)的任何事件(不只是Click)都可以做為特定Action的觸發(fā)條件。而每一個(gè)Actionr都代表著一種行為,而程序設(shè)計(jì)人員(developer)可以設(shè)計(jì)出各式各樣的Action,讓設(shè)計(jì)師(Designer)直接使用。
那Trigger、Action、Behavior三者之間究竟有何關(guān)系呢?
從上面的操作中我們可以知道,Action是經(jīng)過程序設(shè)計(jì)師封裝好的某種行為(功能),我們可以把一些常用的代碼段,例如上面用到的『動(dòng)畫撥放』、或是先前我們提過的『發(fā)一封信』、或『將窗體上的數(shù)據(jù)存入數(shù)據(jù)庫』…等『功能』整理成一個(gè)個(gè)的Action,而開發(fā)人員只需要把Action拖曳到特定的對(duì)象上即可使用。
當(dāng)然,拖曳到目標(biāo)對(duì)象上之后,還得要設(shè)定這個(gè)Action的相關(guān)信息,也就是該Action的屬性(如果有的話),以及該Action被觸發(fā)的時(shí)機(jī),而這就是所謂的Trigger了。
在Silverlight中,預(yù)設(shè)的Trigger有底下幾種:
1.EventTrigger:最常用的觸發(fā)器,可選擇在控件的特定事件發(fā)生時(shí)觸發(fā),例如Loaded、MouseLeftButtonDown、GotFocus…等。
2.TimerTrigger:可設(shè)定每n毫秒觸發(fā)一次,總共要觸發(fā)幾次或隨時(shí)間持續(xù)觸發(fā)。
3.KeyTrigger:可設(shè)定在特定按鍵被按下時(shí)觸發(fā),可捕捉到鍵盤上的一般按鍵與功能鍵,亦可抓取Ctrl, Alt等組合控制鍵。
4.StoryboardCompletedTrigger:在特定動(dòng)畫撥放完畢后觸發(fā)。
請(qǐng)注意,這些Trigger是配合著Action使用的,你會(huì)發(fā)現(xiàn),每一個(gè)Action都可以透過Blend設(shè)定Trigger,并透過Trigger來觸發(fā)執(zhí)行此Action,如此一來,我們就可以相當(dāng)靈活的在場(chǎng)景中特定控件的特定事件發(fā)生時(shí),來執(zhí)行特定工作。
也就是說,在這個(gè)機(jī)制下,只要程序設(shè)計(jì)師預(yù)先寫好Trigger與Action,Designer就可以在完全不撰寫任何程序代碼的狀況下,來開發(fā)出一個(gè)Silverlight應(yīng)用系統(tǒng)或網(wǎng)站。
我們剛才提到了Action與Trigger,那Behavior呢?難道Behavior不需要Trigger嗎?其實(shí)不是的,應(yīng)該說,Behavior是內(nèi)建(包含)了Trigger!!!
你會(huì)發(fā)現(xiàn)當(dāng)場(chǎng)景中的某一個(gè)對(duì)象被套用了Behavior之后,不需要設(shè)定任何Trigger,該對(duì)象就會(huì)自動(dòng)擁有某種功能,就好像我們剛才介紹了的MouseDragElementBehavior一樣,當(dāng)該Behavior套用在某個(gè)對(duì)象上,該對(duì)象就直接支持拖曳行為了,因此,你可以將Behavior直接想象成Trigeer與Action的結(jié)合。
我們先談到這邊,下一篇?jiǎng)t要來介紹Action的開發(fā)方式...
從前面的介紹中我們可以知道,當(dāng)我們?cè)O(shè)計(jì)好了Action或Behavior之后,其實(shí)不僅是設(shè)計(jì)師(Designer)可以使用,一般開發(fā)人員在撰寫應(yīng)用程序時(shí),也可以將常用的功能封裝成了Action或Behavior,讓其他開發(fā)人員直接套用。
我們?cè)谶@邊看一個(gè)簡(jiǎn)單的例子,從這個(gè)例子當(dāng)中我們也來看如何設(shè)計(jì)Action。請(qǐng)參考底下這個(gè)畫面:


這是一個(gè)很典型的簡(jiǎn)單輸入畫面,使用者可以在TextBox中輸入文字,但是,當(dāng)用戶點(diǎn)選TextBox的時(shí)候,得先把TextBox中的文字先清空后才能輸入,體貼一點(diǎn)的程序,會(huì)在用戶點(diǎn)選該TextBox時(shí),就直接讓該TextBox中的文字變成『選取』狀態(tài),這樣使用者就可以直接輸入了:
當(dāng)然,要達(dá)成這樣的功能相當(dāng)容易,只需要在TextBox的GotFocus事件中撰寫『this.TextBox1.SelectAll();』即可。但是每一個(gè)TextBox都要這樣寫,顯然很麻煩,如果可以跟剛才一樣,把一個(gè)對(duì)象(Component)直接拖曳到TextBox上,該TextBox就自動(dòng)具有此功能,豈不挺好?
是的,我們緊接著就來看如何設(shè)計(jì)這樣的Action。
請(qǐng)先建立一個(gè)Silverlight項(xiàng)目(當(dāng)然您也可以在現(xiàn)有的Silverlight項(xiàng)目中直接建立Action或Behavior類別,不過為Action或Behavior建立一個(gè)獨(dú)立的項(xiàng)目是比較理想的選擇),該項(xiàng)目請(qǐng)選擇『Silverlight Class Library』即可,接著,請(qǐng)?jiān)谠擁?xiàng)目中建立一個(gè)Action類別,當(dāng)您在項(xiàng)目中選擇Add New Item時(shí),可以找到Blend分類下的Action Template,我們建立一個(gè)名稱為『TextBoxAutoSelectAction』的Action,你會(huì)發(fā)現(xiàn)建立出來的類別如下:
public class TextBoxAutoSelectAction : TriggerAction<DependencyObject> { public TextBoxAutoSelectAction() { // Insert code required on object creation below this point. } protected override void Invoke(object o) { // Insert code that defines what the Action will do when triggered/invoked. } }
請(qǐng)將TriggerAction調(diào)整成TargetedTriggerAction,并將<DependencyObject>改為< TextBox >。
TargetedTriggerAction是一個(gè)泛型類別,其中的<DependencyObject>則可設(shè)定為我們默認(rèn)的目標(biāo)對(duì)象。例如,我們現(xiàn)在設(shè)計(jì)的這個(gè)TextBoxAction主要的使用對(duì)象是TextBox,因此我們可以寫成『TargetedTriggerAction<TextBox>』。而繼承TargetedTriggerAction這個(gè)類別必須要實(shí)作Invoke方法,Invoke方法是該Action被觸發(fā)時(shí),要執(zhí)行的動(dòng)作。
接著,我們?cè)贗nvoke方法中撰寫的程序代碼如下:
protected override void Invoke(object o) { TextBox TargetObject=Target; TargetObject.SelectAll(); }
其中的Target是目標(biāo)對(duì)象,也就是我們將來把該Action拖曳到TextBox時(shí)所指定的控件,而我們針對(duì)該Target呼叫其SelectAll()方法,來選取其中的文字。就這樣,完成了。
接著我們編譯建置該項(xiàng)目,然后在我們的Silverlight主項(xiàng)目當(dāng)中,引用(Add Reference)建置好的.dll,

當(dāng)項(xiàng)目中正確的引用了該.dll之后,就可以開始使用了,請(qǐng)切換到Blend 3,依照剛才我們先前介紹如何使用Action的方式,切換到Assets頁標(biāo)簽下,您會(huì)看到我們剛才建立的這個(gè)Action已經(jīng)出現(xiàn)在選項(xiàng)當(dāng)中(如果沒有找到,請(qǐng)檢查一下是否有正確的引用該.dll或是該項(xiàng)目)。這時(shí)候,您可以直接將該Action (TextBoxAutoSelectAction)拖曳到畫面中的TextBox上:
拖曳上去之后,切換到屬性窗口,可以設(shè)定該Action的屬性:

請(qǐng)將Trigger中的EventName設(shè)定為GotFocus,接著將TargetName設(shè)為TextBox1,整個(gè)設(shè)定的意思是:當(dāng)TextBox1的GotFocus事件被觸發(fā)時(shí),在TextBox對(duì)象上(將TextBox1對(duì)象視為Target)執(zhí)行該Action(也就是讓TextBox中的文字被選取)。
經(jīng)過這樣的設(shè)定后,應(yīng)用程序執(zhí)行時(shí)只要用戶一點(diǎn)選TextBox1或是透過Tab鍵切換到TextBox1(GotFocus事件被觸發(fā)),TextBox中的文字就自動(dòng)被選取了。未來我們只需要把這個(gè)Behavior拖曳到任何TextBox對(duì)象上,就可以不須撰寫任何程序代碼,在需要的時(shí)候執(zhí)行此Action。
盡管這個(gè)范例似乎很簡(jiǎn)單(只是選取文字),但重點(diǎn)是透過這樣的技術(shù),開發(fā)人員可以利用此機(jī)制,或設(shè)計(jì)出各式各樣的Action,供其他Developer或Designer使用,諸如影片的控制(播放、暫停)、甚至是各種窗口或是動(dòng)畫的處理(例如對(duì)象的淡入淡出…)。總括來說,Action是一個(gè)相當(dāng)好用且重要的功能,值得開發(fā)人員廣泛的使用在自己的項(xiàng)目當(dāng)中。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
