在WPF中自定義控件_第1頁
在WPF中自定義控件_第2頁
在WPF中自定義控件_第3頁
在WPF中自定義控件_第4頁
在WPF中自定義控件_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在wpf中自定義控件(1):概述周銀輝一,不一定需要自定義控件在使用wpf以前,動(dòng)縄便用自定義控件幾乎成了慣性恩維,比如需耍一個(gè)帶圖片的按鈕,但在wpf中此類任務(wù)卻不幣耍如此大費(fèi)周章,因?yàn)榭丶梢郧?套便川以及可以為控件外觀打造一套新的樣式就可以了足否需耍我們來fl定義控件,這需耍你考慮目前己有控件的戊止邏軻功能而不翌局限丁外觀,如果 目詢的控件都不能直覺地表達(dá)你的想法,那么你可以1*1己來打造一個(gè)控件,否則,也許我們僅僅改變一下目前控件的膜板鏗就可以完成任務(wù)很女人在"定 義控件上經(jīng)常犯的錯(cuò)謀是:碇父撰寫己有的邏徘二,u$erotrol 還是 cutomcontrol?耍莊xvpf中

2、門定義一個(gè)控件,便用u&ercontrol與customcontrol都是不錯(cuò)的選擇(除此z外,還冇更篡選擇,比如打造一個(gè)fl定義的面板,但這不在本文 的討論范國(guó))他們的區(qū)別在丁:usercontrolh-更像winfonn'i-n定義控件的開發(fā)鳳格,在開發(fā)上更簡(jiǎn)單快速,幾卩可以簡(jiǎn)單地理解為:利用設(shè)計(jì)器來將多個(gè)c右控件作為子元索來拼湊 成_個(gè)usercontrol并修改其外觀,然后后臺(tái)邏輯代碼直接訪何這些子元素貞堆大的弊端在于貞對(duì)模板樣式導(dǎo)支持度不好,其重復(fù)便用的范圍有限.customcontrol, h開發(fā)出來的控件才戊止具冇vpf鳳格,其對(duì)模板樣式仃看很好的支持,這足岡為打

3、造customcontrol時(shí)做到了邏輯代碼與外觀相分離, 即便換上一套完全不同的視覺樹其同樣能很好的i.作,就像vpf內(nèi)超的控件一樣.在使用visual studio打造控件時(shí),usercontrol與customcontrol的差別就更加明顯,在項(xiàng)11屮添加一個(gè)usercontrol時(shí),我們會(huì)發(fā)現(xiàn) 設(shè)計(jì)器為我們添加了 個(gè)xaml文件以及一個(gè)對(duì)應(yīng)的.cs文件(或.vb零),然后你就可以像設(shè)計(jì)普通謝體一樣設(shè)計(jì)該usercontrol;如果我們是在項(xiàng)目中添加一個(gè)customcontrol, 情況卻不是這樣,設(shè)計(jì)器會(huì)為我們生成 個(gè).cs文件(或.vb等),該文件用丁編寫控件的后臺(tái)邏 輯,而控件的外

4、觀卻定義在了軟件的應(yīng)用主題gme)中了(如 果你沒有為軟件定義通用主起次會(huì)1*1動(dòng)生成一個(gè)通用主題themes'genenc xaml.然后主題中會(huì)1*1動(dòng)為你的控件生成一個(gè)style),并將通用主題與該控件關(guān) 聯(lián)了起來這也就足customcontrol對(duì)樣式的支持度比usercontrol好的廉岡.三,繼承于uhicobtorucontrd還是其它?如果你準(zhǔn)備打造 個(gè)控件併便用像visual studio這樣的i.具來開發(fā)的話,打造useicontro 1時(shí)其會(huì)1'1動(dòng)為你從system.windows.controls.usercontrol繼 承,打造customcont

5、rol時(shí)英會(huì)為從system.windows.controls.control繼承.但實(shí)際惜況下,也許我們從他們的衍生類別開始繼承會(huì)得到更女的好處(更好的吭 用己仃的邏輯),比如你的控件擁冇更篡的類似v button的某叫恃性,那么從button開始繼承就比從control繼承少寫很多代昭.在接卜-來的兒節(jié)中,我們會(huì)逐步討論如何打造usercontrol與cxistomcontrol以及讓它們更好支持wpf和待性.在wpf中自定義控件(2) usercontrol周銀輝在這屮:我們將將打造 個(gè)usercontrol(用戶控件)來逐步講解如何在vpf '|' |'|定義控

6、件,并將wpf的一些新持性引入到|'|定義控件中來.我們制作了一個(gè)帶語音報(bào)時(shí)功能的鐘衣控件,效果如下:cbckde1 s:c4:23在vs中右鍵單擊你的項(xiàng)ii,點(diǎn)擊”添加新項(xiàng)日",在出現(xiàn)的選擇列衣中選擇"usercontrol".vs會(huì)fl動(dòng)為你生成一個(gè)*.xaml文件以及英對(duì)應(yīng)的后臺(tái)代碼文件 g或我它).的是,"動(dòng)生成的代碼中,你的控件足繼承于system.windows.controls.usercontrcl類的,這對(duì)應(yīng)你的控件而言并不一定足錄恰當(dāng)?shù)幕?類,你可以修改它,但注總你應(yīng)該同時(shí)修改*.cs文件和*.xaml文件中的基類,而不只是修

7、改tcs文件,否則當(dāng)生成項(xiàng)目時(shí)會(huì)報(bào)錯(cuò)"不是繼承丁同一基類".修改 8xain 1文件的方法是:將該文件的第一行和錄品行"usercontrol"改成打你認(rèn)為恰當(dāng)?shù)幕惷Q.1,為控件添加屬性(依聯(lián)11性,dependencyproperty)止如下面的代碼所示:public scacic readonly dependencyproperty timepropery =zependencyproperry. -egiser ("tiir.e1', zypeof (datetime) z zypeof (clockusercrrl),ne

8、w frair.eworkpropertyketadata (dacetime .no討,nexi; propertychangedcallback (timepropertychangedcallback) >我們?yōu)榭丶?或打任何一個(gè)wpf類)添加的依聯(lián)屈性都是"公開的”,"靜態(tài)的”,"只讀的",英命名方式足”屈性名+proper匸y”,這是依賴屬性一成不變的 節(jié)寫方式.對(duì)丁依賴屈性的注冊(cè)可以在曲明該屬性時(shí)就調(diào)用dependencyproperty.register ()方法注刪,也可以在其靜態(tài)構(gòu)造方法中注冊(cè).上面的 dependency?rcp

9、er-y.register方法的幾個(gè)參數(shù)分別是:屈性名(該屈性名9注明的依賴屬性名稱"xxxproperty"相比僅僅是少了"property" 后綴,其它完全一樣,否則在運(yùn)行時(shí)會(huì)報(bào)異常),尿性的數(shù)攜類型,屆性的擁有者的類型,元數(shù)據(jù).關(guān)j'參數(shù)屮傳遞的元數(shù)抵:如果是普通的類則應(yīng)該傳遞propertymetaaa-a,如果足framewcrkelement則可以傳遞 framewcrkpropertymetadaca,其中framewcrkpropertymetadaca屮可以制定此標(biāo)記農(nóng)明該屈性發(fā)住變化時(shí)控件應(yīng)該做出什么反應(yīng),比如某 w性的變化會(huì)

10、彩響到該控件的繪制,那么就應(yīng)該像這樣m寫該屈性的元數(shù)據(jù):new framewcrkpropertymetadaca (defaulevalue, framewcrkpropertymetadacaopticns .af fectsrenaer);樣"j該屈性發(fā)生變化時(shí)系統(tǒng)會(huì)考總匝繪該控件.刀外元數(shù)據(jù)中還保護(hù)很篡內(nèi)容,比 如默認(rèn)值,數(shù)據(jù)驗(yàn)證,數(shù)據(jù)變化時(shí)的回調(diào)函數(shù),足否參與屈性”繼承"鏗.然后,我們將該依賴加性包裝成普通屆性:description ("»取或設(shè)樂當(dāng)前日期和時(shí)間j】category (''common propertles1*

11、)public dacetime timeeeget黑(recurn (dacetime)this.getvalue(timeproperty);卜 set黑(chis. setvalue (titneproperty, value);卜 l gecvalue和secvalue方法來i'l j: dependencyobject類,其用j:獲収或設(shè)??類的某皿性值.»:在將依賴加性包裝成普通屈性時(shí),在get和sec塊中除了按部就班的調(diào)用getvalue和servalue方法外,不要進(jìn)行任何冀它的操作.下而的代碼是不恰當(dāng)?shù)模?description取或設(shè)飪當(dāng)前日期和時(shí)間t】ca

12、tegory (''common propertles1*) public dacetime timeeeget於(recurn (dacetime)this.getvalue(timeproperry); secchis. setvalue (titneproperty, value);chis.ontimeupdated(value);/error在以前這或許足很多人的慣用寫法,但在wpf中,這樣的寫法在潛莊的錯(cuò)謀,廉肉如下:我們知道繼/ft ? dependencyobject的類珈有g(shù)etvalue和 secvalue方法來獲取或設(shè)氏,尿性值,那為什么我們不氏接使用該方

13、法來談取或設(shè)賢皿性值,而嬰將兀包裝成秤通的.net屬性呢川實(shí)上在這里兩種方 式都是可以的,只不過包裝成普通 的.net屬性更符合.net開發(fā)人員的習(xí)慣,便用ge匸value和setvalue更像java開發(fā)人員的習(xí)慣,但xaml在執(zhí) 行時(shí)1uf t java開發(fā)人員一樣,英不會(huì)調(diào)川.net加性而足fi接便用gecvalue或setvalue方法,這樣一來,我們寫在get塊和sec塊中的其它代 碼根木不會(huì)被xaml執(zhí)行到.所以說,就上面的time航性而言,c# (或英它)對(duì)該屈性的調(diào)用不會(huì)出現(xiàn)任何何題,但該屬性被用在xaml中時(shí)(比如右:xaml 對(duì)該屈牲進(jìn)行數(shù)據(jù)綁定術(shù),h- set塊中的thi

14、s. ontimeupdaced (value);語句不會(huì)被執(zhí)行到.那么,當(dāng)time屈性發(fā)生變化時(shí)的確需耍調(diào)川this. ontimeupdated(value);語旬(岡為該語句會(huì)引發(fā)時(shí)間被更新了的爭(zhēng)件),還足在傳遞的依賴屈性尤數(shù)據(jù)做文貳:new framework?rcperymecadata(datetime.now,new(timepropertychangedcallback),我們?yōu)閷傩缘淖兓鸲藗€(gè)阿調(diào)慚數(shù),“1該屈件變化時(shí)該冋調(diào)用數(shù)就會(huì)被執(zhí)療:private scacic vod timepropertychangedcallback(dependencycbject send

15、er, dependencypropertychangedevencargs arg) eeif (sender != null && sender is clockuserccrl)黑(clockuserccrl clock = sender as clockuserctrl;clock.ontimeupdaced(dacetime)arg.01dvaluez (dacetime)arg.newvalue);&為控件添加事件(傳閱事件砂irtedevent)添加傳閱車件的方法與添加依賴屈性的方法很類似:public static readonly roiitedeve

16、nt timeupdatede'. eiit =et-entmanager.registerroutede,.-ent(',timeupdated,*,routm 岸 strategy .bubble, tpeofcroutedpropemhangede'.enthandlekdatetime. n,t>eof(clockuserctrl);集支持方法eventmanager. registerroutedevento對(duì)應(yīng)的幾個(gè)參數(shù)分別為:爭(zhēng)件名稱,事件傳閱的方式(向上傳閱,向下傳閱或不傳閱),事件對(duì)應(yīng)的eventhandler的類型,爭(zhēng)件擁冇齊的類切然后將車件包

17、裝成普通的net爭(zhēng)件:descnption("li期或?qū)濋g被史新后發(fā)牛.”)public e.-ent routedpropem<hange<ie,. enthajidler<datetime> timeupdatedeeadde申this. addhandleift lmeupdatede.-ent,十 alue);remo'i-ee申dus.remo'. ehaadleixtiineupdatede'.-ent, value);ii總,與依賴,尿性一樣,不耍在add與remove塊中添加除addhandler與removehandl

18、er以外的代碼.題外話,事件參數(shù)中的e.handled=true并不是終止?fàn)幖膫鏖?,這只是為爭(zhēng)件做-個(gè)標(biāo)記而己,以便在默認(rèn)情況卜的讓那些爭(zhēng)件處理函數(shù)在該標(biāo)記為true的情 況卜-不被調(diào)用,要為該標(biāo)記為true的“件注刪處理方法并讓該方法得到執(zhí)彳亍,請(qǐng)便用addhandler方法j:把腳訂個(gè)參數(shù)bandlereventsto。設(shè)腔為tnie,如卜:this.mylnkcan'i-as.addhandlercinkc an-« -as .mouseleftbuttondonet-ent. new mousebiittone'.enthandleit myinkcant-

19、as_mouseleftbuttondoti).true);pri-ate 十 oid mylnkc anva$_mouseleftbvittondoxn( object sender. mousebiittone'. entargs e)/do something 然后編寫慣川的onxxx方法:protected virtual void ontimeupdated(datetime oldxalue. datetmie neafalue)eeroutedpropert>,chadgedet-entarg$<datetime> arg =new routedprop

20、em<'liange<ie,. eiitargs<datetime>(oldyalue. ne-x alue,timeupdatedevent); this.raisee'i-enarg);3,為控件添加命令(commands)能為fl宦義控件添加如vpf內(nèi)置控件一樣的命令是 件很不錯(cuò)的khvcji實(shí)卜.這也是 customcontrol中降低界而和后臺(tái)邏輯耦介度的種方汕.木系列隨筆中的下一篇中將會(huì)兵體談?wù)?.vpf屮內(nèi)世的命令仃兩大類型:roiitedcommand以及routeduiconmxand.,'u者比前再多了 個(gè)text屈性丿i在界

21、面上|木地化 地顯樂該命令對(duì)屁的文 8木,更多的町以參石wpf屮的命令與命今綁定()以及wpf屮的命令y命今綁定().這里我們來定義-個(gè)命令,其功能足控件的語w報(bào)時(shí)忤先我們定義一個(gè)命令:public static readonly roitteduicommand speakcommand = new roitteduicommandcspeak'. speak". t)peof(clockuseictrl);參數(shù)分別為命名的顯示名稱,命令的名稱,命令的擁冇者類型然后在控件的靜態(tài)函數(shù)中定義個(gè)命令綁定,該命令綁定定義了命令的具體細(xì)節(jié):對(duì).應(yīng)的命令是什么?賓完成什么樣的功能,當(dāng)前

22、環(huán)境下其能執(zhí)行嗎?c ommandb mding commandbin<lmg =new commandbmding(speakcomniani new execiitedroutedetenthaudlei(e?cecutespeak), newcaiiexecuteroute<iet-enthandler(canexecutespeak);pnvatq static void execiitespeak(object sender. executedroutede'. entargs arg)eefclockuserctrl clock = sender as cloc

23、kuseictri;if (clock != null)韓clock. speakthetimeo; pnvatq static void canexecutespeak(object sender. canexecuteroutede*'-entargs arg)eefclockuserctrl clock = sender as clockuseictri;arg.caxiexecute = (clock != null);canexecuteroutedeventargs的canexecuce屬性用掘示"i詢命令是否可用,也就是說系統(tǒng)會(huì)不斷地檢視該命令打該命令的 作用對(duì)

24、彖,并根據(jù)你 所捉供的條件來判斷當(dāng)前命令是否可用,比如文本框狀態(tài)變?yōu)?quot;只讀"后,劉粘貼”命令將不可用,作用丁該文本松的粘姑按鈕會(huì)1*1動(dòng)被禁用,反z則啟用 new execucedrcutedevenchandler (executespeak)委托拆述了 "i該命令被執(zhí)行時(shí)所嬰完成的任務(wù),這通過1“1調(diào)excutespeak兩數(shù)來實(shí)現(xiàn).pn-ate static void execiitespeak(object vender. executedroutede'. entargs arg)eefclockusexctrl clock = sender a

25、s clockuseictri;if (clock != null)e申clock. speakthetimeo;pn-ate 十oid speakthetimeoeefdatetime localtime = this.time.tolocaltimeo;string texttospeak = m現(xiàn) 在時(shí)刻localtime.toshortdatestringo +'*,*localtime. toshorttimestringo +,星期.+ (molocaltime.dayoweek:thi$.speecher.speakasync(texttospeak):l 我們也町以為命

26、令添加快捷鍵,這是通過inputbmding來實(shí)現(xiàn)的洪將命令9命令的快捷鍵關(guān)聯(lián)起來,比妣inputbmding mputbinding = ne* inpiitbmding(speakcommani ne* mousegestiire(mouseaction.leftchck);commandmanagerregisteiclassinputbmdmgktypeokclockuseictrl), mputbindmg);這樣嚴(yán)我們風(fēng)標(biāo)點(diǎn)擊控件時(shí)就會(huì)引發(fā)控件的speak命令,從而調(diào)用speakthetime函數(shù)進(jìn)行語音播報(bào).快她鍵町以通過iousegesture或keygesture來定義.4,

27、優(yōu)點(diǎn)與缺點(diǎn):止如在九丸tf屮|'|疋義控件'i'談到的一樣,usercontrol陡比較快速的打造d定義控件,但其對(duì)模板樣式鏗缺乏很好的支持,打造出來的控件不如wpf 內(nèi)世控件 樣靈活,右:木系列馳筆的下篇中,我們將介紹如何打造能對(duì)wpf新特性捉供完全支持的customcontroldemo在wpf中自定義控件(3) customcontrol (上)周銀輝為快速地為你的血用定制一個(gè)零部件,你需嬰的是useicontrol,這可以參考在wpf屮fl足義控件usercontrol,為了讓你打造的控件更標(biāo)準(zhǔn)化,更靈 活以及更具右普逛總義,你尙耍用到的customcontro

28、l,這止足木文妥介紹的.1 踴建 castomcontrol在選擇控件基類后,第一件車惜便足在你的項(xiàng)目中新建”customcontiol",我們會(huì)發(fā)現(xiàn)在項(xiàng)目中1*1動(dòng)生成了一個(gè)匸cs(或* vb或冀他)文件以及 themesgeneric. xaml(如果原來沒有的話),他們分別是 customcontrol的后臺(tái)代碼文件(code behind)與控件的默認(rèn)主題文件,打開 themes'generic.xaml,你會(huì)發(fā)現(xiàn)k'l'fl動(dòng)生成了一個(gè)style,這是你的控件的默認(rèn)樣式,止如vpf內(nèi)就控件也右它的默認(rèn)樣式一樣.這時(shí),我們的i.作就被 分成了兩個(gè)部分,

29、是在xxx.cs文件中編輯控件邏軻,而足在generic.xaml中編 寫hui.2,gericaml中的styk是如何與我們的控件聯(lián)系在一起的打開xxx.cs文件,你會(huì)發(fā)現(xiàn)靜態(tài)構(gòu)造方法中,vs門動(dòng)地帶你扱蓋了控件的defhultstylekey(1*(:static customcontrol 10eedefaxiltstylekeypropertyoemdemetadata(typeof(cu$tomcontroll), new frainevorkpropert-metadata(typeof(customcontroll);我們知道defaultstylekeyproperty是fra

30、meworkelement以及fraineworkcontentelement癸用來 指示控件的默認(rèn)if的屈性,該屈性仃個(gè)很持別的地方就是我們不能夠用繼水的思想來思考它,比如說button的默認(rèn)樣式泄伉是stylel.j畀類mybutton的默認(rèn)樣式鍵值是style2(或者沒冇指定默認(rèn)樣式), 盡管mybutton可以向上轉(zhuǎn)型成button類,但我們井不希望冀轉(zhuǎn)型后的 默認(rèn)樣式鍵值為stylel.所以vpf采用了在子類控件的靜態(tài)構(gòu)造方法中碇寫 defaxiltstylekey尤數(shù)據(jù)的方式來拆定該了類控件的默認(rèn)樣式.1:血代碼中,我們將new frameworkpropertymecadata

31、(typeof (cusrcmcon-roll) 指定為其新的元數(shù)據(jù)值,這個(gè)值代表若,我們將在資源丫典中査找 個(gè)鍵值為n-peof(customcontroll)的style來做為控件的默認(rèn)樣式.而這個(gè)樣式剛好被我 們定義在了 generic.xaml中:<style targettj-pe=m (x:type locahcustomcontroll"><setter property="template"><setter.valie><c ontroltemplate targett>pe=" x:typ

32、e local: customcontrol 1<border backgrouxid=" templatebmding background"borderbiusli=" temphtebindmg borderbrushmborderthickness=* temphtebinding borderthickness"><border><c ontroltemplate>setter. value</settei>u'style>這是大家可能冇個(gè)疑問,上面xaml中的style并沒有指定k

33、ey值啊,而我們的控件耍求的默認(rèn)樣式key值為 卯eorcustomcontroll),并且資源7典 中的元索肯定足翌仃key的?這是style的基木釧識(shí)了,在wpf中,為style指定key時(shí)冇兩種方式:一足明購(gòu)指足key,而足在沒冇明確指定key的惜況下 指定targettvpe.tf會(huì)1動(dòng)地將其可key設(shè):世為typeof(targettype).如果你仃在blend中為控件打造style的經(jīng)臉的話,你會(huì)注童到新建一個(gè)style時(shí)bend 會(huì)捉供一個(gè)“apply to all"選項(xiàng),這也是為什么你打造的style可以"apply to all"的奧秘所在.1

34、23, “gericqnr這個(gè)名稱并非偶餓通過上面的敘述,你可能會(huì)有沖動(dòng)將genenc xaml中的style代碼咧切出來,粘貼到任何一個(gè)我們的控件可以找到的地方,然后把genenc.xaml刪掉或改 成更優(yōu)雅的名稱,如果你運(yùn)氣好的話,這是可行的,因?yàn)榭丶?huì)1'1下而:(page«app.theme)去金找英所需耍的style,但此時(shí)你(2經(jīng)犯了一個(gè)潛在的錯(cuò)謀:你沒冇 為控件捉供默認(rèn)的樣式這里的默認(rèn)樣式其實(shí)是說"在默認(rèn)主題中或沒仃為該控件找到艸前操作系統(tǒng)對(duì)應(yīng)的主題時(shí)采用的的樣式”這涉及到wpf屮theme 的相關(guān)話題了,右興趣可以參考msdn相關(guān)sdk.4, 打造你

35、的控件邏輯這是必然的,添加屆性,添加爭(zhēng)件,方法箋空這西你可以參考在wpf中門定義控件usercontrol,這里就不吭復(fù)敘述了一&打造控件ui這里值得一捉的是我卄常佩服在vs的xaml海洋也"裸泳"的兄弟們,不過我更推薦使用microsoft expression blend來完成這項(xiàng)艱巨的任務(wù).另外,如果 你發(fā)現(xiàn)wpf內(nèi)置控件在blend屮很好用而我們自己打造的控件卻不是這樣,那么請(qǐng)注意了,你的控件邏輯可能設(shè)計(jì)得不規(guī)范.綏件ui部分與邏輯部分的耦合度這足一個(gè)容易被忽略但卻ii:常雨耍的何題,我們z所以使用customcontrol而不是usercontrol,足肉

36、為我們希望fl己的控件能向wpf內(nèi)置控件一樣, r-uifts輕易地被1(他川戶定制或我們將來所改變.也就是說其視覺樹不能與后臺(tái)邏徘糾纏在一起,因?yàn)槠湟曈X樹中的元素完全可能被你的控件用戶改變 比如,如果你的控件的視覺樹中有一個(gè)buttonjiij你在該button的click m件中做了一此控件的邏輯處理,那么很町能你的控件打造失敗了,因?yàn)樵揵utton可 能會(huì)在用戶碗新定義控件template時(shí)被刪除-在 wpf中自定義控件(3) customcontrol (下)在wpf中自定義控件(3) custoncontrol (下)周銀輝1,控件ui部分與邏輯部分的耦合這是 個(gè)容易被忽略但卻ii,

37、;,t偵的問題.我們z所以便丿1 customcontrol iij仁是usercontrol.是1人1為我們希刃自己的擰件能向wpf內(nèi)代控fl iv.hui 能輕易地被其他用戶定制或我們將來所改變也就足說其視覺樹不能與后臺(tái)邏輯糾編在一起,因?yàn)橛⒁曈X樹中的元索完全可能被你的控件用戶改變上匕如, 如果你的控件的視覺樹中有 個(gè)button,而你在該button的click車件中做了 些控件的邏輯處理,那么很可能你的控件打造失敗了,因?yàn)樵揵utton可能會(huì) 在用戶碇新定義控件template時(shí)被刪除-在討論解決方案z前,需嬰捉醒的是:一定耍注意控件的邏軻與ui衣現(xiàn)(style.template)備|

38、'|職擊的區(qū)分.不屬亍后臺(tái)邏徘竇的車惜后臺(tái)邏軻就 不嬰管,不屈 于界面符的事情界面基本上也符不了或者說做起來很麻煩一個(gè)簡(jiǎn)單的例子足:1:匕如說你想iu標(biāo)移動(dòng)到你的控件上的爭(zhēng)惜,控件稍稍變大一點(diǎn),ir標(biāo)離開控 件時(shí)控件大小又還原(或其他比較絢麗的效果),那么你在控件上的后臺(tái)邏輯屮添加的mouseenter與mouseleave爭(zhēng)件的處理來達(dá)到這效ju.這時(shí)你的后臺(tái) 邏軻就管得過寬了,岡為這種效果是style的爭(zhēng)情,你可以把它肢在控件的默認(rèn)style中(在generic.xaml中,你可以參考在wpf屮“定義控件 customcontrol (上)來捉供給控件用戶而不屁該加在后臺(tái)邏軻中而費(fèi)

39、力不討好.這不但噌加了輻合,而且在用戶祈來這也冇些"強(qiáng)奸民意",因?yàn)樗麤]冇辦法通 過ii定義的style來披蓋掉你認(rèn)為比較漂亮的控件效果-雖然vpf將ui與后臺(tái)邏軻的隔離c經(jīng)做得很不錯(cuò)了,以便ui設(shè)計(jì)師陡和我們更好的溝通和分i.協(xié)助,但這并不盤味若.wpf可以將ui與后臺(tái)完全的隔離 而4不影響.車實(shí)上,我們?cè)诰帉懫放_(tái)邏輯的時(shí)候常常需嬰用到控件ui樹中的某些元索才能完成,比如在編"iprogressbar時(shí)我們需耍知道視覺樹中的某個(gè) 農(nóng)示"總竝"的元索的長(zhǎng)度或高度,以便根據(jù)progressbar的當(dāng)前value來確定視覺樹屮另外一個(gè)衣示"

40、;當(dāng)前城"的元索的長(zhǎng)度或高度.還冇種怡況是,我們品 臺(tái)寫好了一個(gè)不錯(cuò)的邏抵但船耍視覺樹中的某個(gè)ui元索來明渤調(diào)用,比如說,我們?cè)趕crollbar控件中寫好了 linedowo方法,但該方法船耍用戶點(diǎn)擊控件 視覺樹中某個(gè)表示”向下滾動(dòng)一行"的元索(比如一個(gè)向下的箭頭)時(shí)來調(diào)用.vpf 捉供了兩種方案,一是利用 templatepartattribute,二足使用 command.1.1 templatepartattributetemplatepart適用p上面所說的第一種情況貞用丁吿知用戶,在11前的惜況下必須在控件的視覺樹中心在拆定類型和名稱的元索才能是控件發(fā)揮完整的功

41、 能,否則可能&致功能喪失或需耍用戶fl行處理訊除視覺樹中的該元索而帯來的品遺癥如果我們足某個(gè)控件的便用斤且其注明了該屈性,那么我們?cè)谛?改控件的template時(shí)就應(yīng)該保證控件屮足拆存在其拆明的特定類型和名稱的元索,除ikttwtld的確不需耍其關(guān)聯(lián)的相關(guān)功能或你已另仃處理.在vpf內(nèi)??丶?這種類型的控件很多,比如combobox.pass-ordbox,progressbar零零.我們 fit comboxbox:templatepartattribute(name = "part_editabletextbox", typw = t)peof(textbo

42、x)templatepartattribute(name = "part_popupm. type = typeo£(popup)locahzabihtyattnbute(localizationc ategorj-.c ombobox)st>-let)pedpropert)-attnbute(property = "itemcontainerstyle'. styletargett)pe = t>peof(comboboxitem)public class coxnbobox : selector我們發(fā)現(xiàn)兀仃兩個(gè)templatepart .w

43、性,個(gè)是textbox類型的'tart.ednabbt敗box”,另一個(gè)是popup類型的p.artjopupjjij者用編輯文本亦打用彈 出列表項(xiàng),如果某個(gè)用戶在|'1址義該控件的template時(shí)缺少了這兩個(gè)元索,將失去相應(yīng)的功隠我們的控件也可以仿照combobox來規(guī)定必須的部件,并0vemde -些onapplytemplaeo方法來取得相應(yīng)元索:public o-emde void onapplytemplateoeebase.onapplytemplateo;button mybtn = base.gettemplatechild(hpart-btnw);if (m

44、ybtn != null)韓mybtn.click -= new routedeventhandler(mybtn_cick):- 1j command這適合上面捉到的第二種情況,即是我們品臺(tái)寫好了 個(gè)不錯(cuò)的邏輯,但需踐視覺樹屮的某個(gè)ui元索來明確調(diào)川.比如scrollbar的i:端和卜-端的兩個(gè)小箭 頭用來上下翻行,我們明顯不能在這兩個(gè)小筋頭的鼠標(biāo)點(diǎn)擊事件中調(diào)用lmedoxvn方法.那么止確的做法足,將后臺(tái)邏軻中的linedown和lineup方法包裝 成linedowcommand和lineupconmiand.然品將視覺樹中的元索的command屈性綁定到相血的command匕這樣來,即便用戶修改視覺樹屮的上下小 箭頭為冀他類型的元索,用戶也可以通過命令綁定來打相應(yīng)的功能聯(lián)系起來.比如'vpf內(nèi)況的scroolbar控件的向下小箭頭的xaml代碼便足如卜h寫的:<repeatbutton isenabled=" templatebinding ismouseo.-er" style=" staticresource scrollbarbutton * gnd ro-m2w command=" x: static sc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論