WPF第四課—命令資源模板_第1頁(yè)
WPF第四課—命令資源模板_第2頁(yè)
WPF第四課—命令資源模板_第3頁(yè)
WPF第四課—命令資源模板_第4頁(yè)
WPF第四課—命令資源模板_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、WPF第四課命令、資源、模板命令我們已經(jīng)知道WPF里已經(jīng)有了路由事件,可以發(fā)布及傳播一些消息,那為什么還需要命令呢?這是因?yàn)槭录肛?fù)責(zé)發(fā)送消息,對(duì)消息如何處理則不管,而命令是有約束力,每個(gè)接收者對(duì)命令執(zhí)行統(tǒng)一的行為,比如菜單上的保存,工具欄上的保存都必須是執(zhí)行同樣的保存。命令系統(tǒng)的基本元素:命令(Command):WPF的命令實(shí)際上就是實(shí)現(xiàn)了ICommand接口的類,平時(shí)使用最多的就是RoutedCommand類。我們還會(huì)學(xué)習(xí)使用自定義命令。命令源(Command Source):即命令的發(fā)送者,是實(shí)現(xiàn)了ICommandSource接口的類。很多界面元素都實(shí)現(xiàn)了這個(gè)接口,其中包括Button,

2、ListBoxItem,MenuItem等。命令目標(biāo)(Command Target):即命令發(fā)送給誰(shuí),或者說(shuō)命令作用在誰(shuí)的身上。命令目標(biāo)必須是實(shí)現(xiàn)了IInputElement接口的類。命令關(guān)聯(lián)(Command Binding):負(fù)責(zé)把一些外圍邏輯和命令關(guān)聯(lián)起來(lái),比如執(zhí)行之前對(duì)命令是否可以執(zhí)行進(jìn)行判斷、命令執(zhí)行之后還有哪些后續(xù)工作等。四個(gè)命令元素之間的關(guān)系基本元素之間的關(guān)系這些基本元素的關(guān)系體現(xiàn)在使用命令的過程中。命令的使用大概分為以下幾步:(1)創(chuàng)建命令類:如果命令沒有涉及到業(yè)務(wù)邏輯的話,一般使用WPF類庫(kù)的RoutedCommand類即可,如果要聲明相對(duì)邏輯復(fù)雜一些的類,可以實(shí)現(xiàn)RouteC

3、ommand類的繼承或者是ICommand的接口。(2)聲明命令實(shí)例:由于命令的普遍性,一般情況下程序中某類命令只需要一個(gè)命令實(shí)例即可(單件模式)。(3)指定命令的源:即指定由誰(shuí)來(lái)發(fā)送命令。通常是可以點(diǎn)擊的控件,命令還有個(gè)好處就是,沒有準(zhǔn)備好的命令,這個(gè)控件不可用。(4)指令命令目標(biāo):命令目標(biāo)并不是命令的屬性,而是命令源的屬性。指定命令目標(biāo)是告訴命令源向哪個(gè)組件發(fā)送命令。無(wú)論這個(gè)組件是否擁有焦點(diǎn)他都會(huì)收到這個(gè)命令。如果沒有為源指定命令目標(biāo),則WPF系統(tǒng)認(rèn)為當(dāng)前擁有焦點(diǎn)的對(duì)象就是命令目標(biāo)。這個(gè)步驟有點(diǎn)像為火炮指定目標(biāo)。(5)設(shè)置命令關(guān)聯(lián):炮兵是不能單獨(dú)戰(zhàn)斗的,就像炮兵在設(shè)計(jì)之前需要偵察兵觀察敵情

4、、判斷發(fā)射時(shí)機(jī),在射擊后觀測(cè)射擊效果,幫助修正一樣。WPF命令需要CommandBinding在執(zhí)行之前來(lái)幫助判斷是不是可以執(zhí)行、在執(zhí)行后做一些事來(lái)“打掃戰(zhàn)場(chǎng)”。命令參數(shù)命令具有一處聲明,處處使用的特點(diǎn),比如New命令,在程序的任何地方它都表示要求命令目標(biāo)新建數(shù)據(jù),所以它們的實(shí)例永遠(yuǎn)只能有一個(gè),這就引起了一個(gè)問題:如果界面上有兩個(gè)按鈕一個(gè)用來(lái)創(chuàng)建Student檔案,一個(gè)用來(lái)創(chuàng)建Teacher檔案。都使用New命令的話,程序應(yīng)該如何區(qū)別新建的是什么檔案呢?答案是使用CommandParameter,命令源一定是實(shí)現(xiàn)了ICommandSource接口的對(duì)象,而ICommandSource有一個(gè)屬性

5、就是CommandParameter,如果把命令看作飛向目標(biāo)的炮彈,那么CommandParameter就相當(dāng)于裝載在炮彈里面的“消息”。ICommand接口與RoutedCommandWPF中的命令是實(shí)現(xiàn)了ICommand接口的類。ICommand接口非常簡(jiǎn)單,只包含兩個(gè)方法和一個(gè)事件:Execute方法:命令執(zhí)行,或者說(shuō)命令執(zhí)行于命令目標(biāo)之上。需要注意的是,現(xiàn)實(shí)世界中的命令是不會(huì)自己執(zhí)行的,而這里,執(zhí)行變成了命令的方法,有點(diǎn)擬人化的味道。CanExecute方法:在執(zhí)行之前探知命令是否可以執(zhí)行。CanExecuteChanged事件:當(dāng)命令的可執(zhí)行狀態(tài)改變的時(shí)候,可激發(fā)此事件通知其它對(duì)象。

6、RoutedCommand就是一個(gè)實(shí)現(xiàn)了ICommand接口的類。RoutedCommand在實(shí)現(xiàn)ICommand接口時(shí),并未向Execute和CanExecute方法中添加任何邏輯,也就是說(shuō),它是通用的、與具體的業(yè)務(wù)邏輯無(wú)關(guān)的。制定自定義Command說(shuō)到自定義命令,我們可以分為兩個(gè)層次來(lái)理解。第一個(gè)層次比較淺,指的是當(dāng)WPF命令庫(kù)里面沒有包含想要的命令時(shí),我們就得聲明自己定義的RoutedCommand實(shí)例。第二個(gè)層次是指從繼承ICommand接口開始,第一自己的命令并把某些業(yè)務(wù)邏輯包含在命令里,這才稱得上是真正意義上的自定義命令。但是WPF中的命令源和CommandBinding就是專門

7、為RoutedCommand編寫的,如果我們想使用自己的ICommand派生類就必須連命令源一起實(shí)現(xiàn)(即實(shí)現(xiàn)IComamndSource接口)。資源每個(gè)WPF界面元素都有一個(gè)名為Resource的屬性,這個(gè)屬性繼承至FrameworkElement類,其類型為ResourceDictionary。ResourceDictionary能夠以鍵值對(duì)的形式存儲(chǔ)資源,當(dāng)要使用到某個(gè)資源的時(shí)候,使用鍵值對(duì)的形式獲取資源對(duì)象。在保存資源時(shí),ResourceDictionary視資源對(duì)象為Object類型,所以再使用資源時(shí)先要對(duì)資源對(duì)象進(jìn)行類型轉(zhuǎn)換,XAML編譯器能夠根據(jù)Attribute自動(dòng)識(shí)別資源類型,

8、如果類型不對(duì)就會(huì)拋出異常,但在C#中檢索到資源對(duì)象之后,類型轉(zhuǎn)換的事情就只能由我們自己來(lái)做了。當(dāng)資源被存儲(chǔ)進(jìn)資源詞典之后,我們可以使用兩種方式來(lái)使用這些資源-靜態(tài)方式和動(dòng)態(tài)方式。靜態(tài)資源使用StatickResource指的是程序載入內(nèi)存時(shí)對(duì)資源的一次性使用,之后就不在去訪問這個(gè)資源了;動(dòng)態(tài)資源(DynamicResource)使用指的是在程序運(yùn)行過程中仍然回去訪問資源。顯然如果你確定某些資源在程序初始化的時(shí)候只使用一次、之后不會(huì)再改變,就應(yīng)該使用StaticResource。二進(jìn)制資源為了不把資源詞典里的資源和應(yīng)用程序里面內(nèi)嵌的資源搞混,我們明確稱呼資源詞典里面的資源為“WPF資源”或“對(duì)象

9、資源”,稱呼應(yīng)用程序內(nèi)嵌資源為“程序集資源”或者“二進(jìn)制資源”。特別提醒一點(diǎn),WPF中寫在.標(biāo)簽內(nèi)的資源仍然是WPF資源而非二進(jìn)制資源。如果要添加的資源是字符串而非文件,我們可以使用應(yīng)用程序名稱空間下的Resources.resx資源文件。Resources.resx文件內(nèi)容的組織形式也是“鍵-值”對(duì),編譯后,Resources.resx會(huì)形成Properties名稱空間中的Resource類,使用這個(gè)類的方法或?qū)傩跃湍塬@取資源。為了讓XAML編譯器能夠訪問這個(gè)類,一定要把Resources.resx的訪問級(jí)別由Internal改為public。利用資源文件編輯器,可以資源文件的字符串里添加兩

10、個(gè)條目,然后分別在XAML代碼和C#代碼中訪問他們。二進(jìn)制資源如果要添加的資源不是字符串,而是圖標(biāo)、圖片、音頻或者視屏。方法就不是使用Resources.resx了,WPF不支持這么做。在WPF使用外部文件作為資源,僅需要將其簡(jiǎn)單的放入項(xiàng)目即可。方法是在項(xiàng)目管理器上右擊項(xiàng)目名稱,在彈出的菜單里選擇New-NewFolder,按需要新建幾層文件夾來(lái)存放資源,然后在恰當(dāng)?shù)奈募A上右擊,在彈出的菜單里選擇Add-Existing Item.,在文件對(duì)話框里選擇文件后單擊Add按鈕,文件就以資源的形式加入項(xiàng)目中了。有一點(diǎn)特別提醒大家,如果想讓外部文件編譯進(jìn)二進(jìn)制資源,必須在屬性窗口把文件的Build

11、Action屬性值設(shè)為Resource。模板從字面上看,模板就是“具有一定規(guī)格的樣板”,有了它,就可以依照它制造很多一樣是實(shí)例。以往的GUI開發(fā)技術(shù)(ASP.NET+Winform)中,控件內(nèi)部邏輯和數(shù)據(jù)是固定的,程序員不能改變;對(duì)于控件的外觀,程序員能做的改變也非常的有限,一般也就是設(shè)置控件的屬性,想改變控件的內(nèi)部結(jié)構(gòu)是不可能的。如果想擴(kuò)展一個(gè)控件的功能或者更改器外觀讓其更適應(yīng)業(yè)務(wù)邏輯,哪怕只是一丁點(diǎn)的改變,也需要?jiǎng)?chuàng)建控件的子類或者創(chuàng)建用戶控件。造成這個(gè)局面的根本原因是數(shù)據(jù)和算法的“形式”和“內(nèi)容”耦合的太緊了。在WPF中,通過引入模板微軟將數(shù)據(jù)和算法的內(nèi)容與形式接耦合了。WPF中的Temp

12、late分為兩大類:ControlTemplate:是算法和內(nèi)容的表現(xiàn)形式,一個(gè)控件怎么組織其內(nèi)部結(jié)構(gòu)才能讓它更符合業(yè)務(wù)邏輯、讓用戶操作起來(lái)更舒服就是由它來(lái)控制的。它決定了控件“長(zhǎng)成什么樣子”,并讓程序員有機(jī)會(huì)在控件原有的內(nèi)部邏輯基礎(chǔ)上擴(kuò)展自己的邏輯。DataTemplate:是數(shù)據(jù)內(nèi)容的展示方式,一條數(shù)據(jù)顯示成什么樣子,是簡(jiǎn)單的文本還是直觀的圖形就由它來(lái)決定了。DataTemplate一樣的內(nèi)容可以用不同的形式來(lái)展現(xiàn),軟件設(shè)計(jì)稱之為“數(shù)據(jù)-視圖”模式。以往的開發(fā)技術(shù),如MFC、Winform、A等,視圖要靠UserControl來(lái)實(shí)現(xiàn)。WPF不但支持UserControl還支持DataTem

13、plate為數(shù)據(jù)形成視圖。DataTempldate常用的地方有三處,分別是:ContentControl的ContentTempldate屬性,相當(dāng)于給ContentControl的內(nèi)容穿衣服。ItemControl的ItemTemplate,相當(dāng)于給ItemControl的數(shù)據(jù)條目穿衣服。GridViewColumn的CellTempldate屬性,相當(dāng)于給GridViewColumn的數(shù)據(jù)條目穿衣服。ControlTemplate控件有著自己的行為,比如顯示數(shù)據(jù)、執(zhí)行方法、激發(fā)事件等??丶男袨橐烤幊踢壿媮?lái)實(shí)現(xiàn),所以也可以把控件的行為稱為控件的算法內(nèi)容。舉個(gè)例子,WPF中的CheckBox與其基類ToggleButton的功能幾乎完全一樣,但外觀差別上卻非常的大,這就是更換ControlTemplate的結(jié)果。實(shí)際項(xiàng)目中,ControlTemplate主要有兩大用武之地:通過更換ControlTemplate來(lái)更換控件的外觀,使之具有更優(yōu)的用戶體驗(yàn)和外觀。借助ControlTemplate,程序員和設(shè)計(jì)師可以并行工作,程序員可以使用WPF標(biāo)準(zhǔn)控件進(jìn)行編程,等設(shè)計(jì)師的工作完成之后,只需要把新的ControlTemplate應(yīng)用的程序中即可。DataTemplate和ControlTempl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論