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

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

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

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


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

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

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

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