?? 聽了曹嚴(yán)明先生的《組合型智能客戶端應(yīng)用 With Composite Application Block》的講座后,對(duì)CAB有了一個(gè)初步的理解,同時(shí)感覺CAB將大有用武之地。于是,本人從微軟網(wǎng)站 http://practices.gotdotnet.com/projects/cab 下載了源代碼,開始研究。
??? 這個(gè)學(xué)習(xí)筆記將主要講述CAB中Commands的應(yīng)用,以及一些本人的疑惑,期望園子里的朋友予以指點(diǎn)。
一、何謂Commands.
??? Commands是CAB程序集里一個(gè)重要的對(duì)象,它主要用來關(guān)聯(lián)控件、WorkSpace和業(yè)務(wù)邏輯,也就是讓一個(gè)命令可以被多個(gè)控件的事件引發(fā)。
一般的情況下可以通過以下代碼關(guān)聯(lián)一個(gè)命令和控件的事件:
??? Commands[strCommandName].AddInvoker(objControl, strEventName);
二、建立測(cè)試Commands的程序
1.打開VS2005,新建Windows Application項(xiàng)目。
2.添加以下引用
- Microsoft.Practices.CompositeUI;
- Microsoft.Practices.CompositeUI.WinForms;
- Microsoft.Practices.ObjectBuilder
3.此時(shí)VS將自動(dòng)產(chǎn)生program.cs,Form1.cs。將Form1.cs命名為TestForm。
4.給TestForm加入菜單。命名為menuStrip1。依次加入菜單子項(xiàng),名稱如下:
- AddNew
- SaveFileTool
- DeleteFile
5.重命名program.cs為CommandsApplication.cs,并且將內(nèi)容修改成以下形式:
























?
修改時(shí)要注意將static class 修改成 class,否則無法通過編譯,提示類似錯(cuò)誤1所示的錯(cuò)誤信息
Static class 'TestUIBlock.CommandsApplication' cannot derive from type 'Microsoft.Practices.CompositeUI.WinForms.
FormShellApplication<TestUIBlock.MainWorkItem,TestUIBlock.TestForm>'.
Static classes must derive from object.CommandsApplication.cs 13 40 TestUIBlock。
?? 如果將static class 修改成 public class,也會(huì)無法通過編譯,提示類似錯(cuò)誤2的信息:
Inconsistent accessibility: base class 'Microsoft.Practices.CompositeUI.WinForms.
FormShellApplication<TestUIBlock.MainWorkItem,TestUIBlock.TestForm>'
is less accessible than class 'TestUIBlock.CommandsApplication' E:\WorkSpace\Projects\TestUIBlock\TestUIBlock\TestUIBlock\CommandsApplication.cs 13 18 TestUIBlock。
??? 錯(cuò)誤1很好理解,就是靜態(tài)的類無法從類型繼承,但是錯(cuò)誤2就讓我有些費(fèi)解,在CAB的Quick Start中就是這樣寫的。和我新建立的不同區(qū)別是,我是通過引用dll來添加引用的,Quick Start是直接引用解決方案中的項(xiàng)目。查閱MSDN幫助對(duì)Inconsistent accessibility的解釋,好像也不能解釋我遇到的這個(gè)問題。
還有就是要將static void Main()修改成 public static void Main(),同時(shí)刪除VS2005默認(rèn)生成的代碼。
6.建立Controller,也就是命令。通常業(yè)務(wù)行為都放到這個(gè)類里。
???? 新建類MainControler文件,將類MainControler從Controller繼承。
???? 編寫過程,并且以屬性[CommandHandler(strKey)]進(jìn)行修飾,其中strKey是Commands集合中注冊(cè)的命令關(guān)鍵字。示例過程寫法如下:
?







?
7.建立WorkItem。
??? 新建類MainWorkItem,并且從WorkItem繼承。
?? 重載Run()方法,代碼如下所示:
?


























?
??? 在Quick Start中是將通過XML文件,將菜單項(xiàng)記錄下來,和Commands集合映射,然后動(dòng)態(tài)加載到主菜單上的。由于我們已經(jīng)在TestForm中創(chuàng)建了菜單項(xiàng),所以可以去掉動(dòng)態(tài)加載到主菜單的操作,但是和Commands集合映射是必不可少的。可是在MainWorkItem中我不知道如何訪問TestForm實(shí)例,去獲取每一個(gè)菜單項(xiàng)(哪位大哥知道的話,請(qǐng)告訴我),于是我只好將映射到Commands部分的代碼放到CommandsApplication中。
??? 8.建立菜單項(xiàng)到Commands的映射。
??? 建立方法ProcessCommandMap(IUIElementService uiService):
?











???? 這里是通過菜單項(xiàng)的名稱和命令的名稱進(jìn)行映射的。我們也可以將多個(gè)控件的事件映射到同一個(gè)命令如:







???? 不知道看過Commands QuikStart的朋友發(fā)現(xiàn)沒有,通過Service的RegisterUIExtensionSite方法注冊(cè)菜單的根后,就可以直接通過Service的Add方法將子菜單添加到父菜單。如以下代碼:



?
??? 我曾經(jīng)嘗試通過同樣的方法在一個(gè)Panel中加入一個(gè)Button,但是失敗了,原因是沒有注冊(cè)對(duì)應(yīng)的UIElementManagerFactory。
9.至此我們已經(jīng)做好了一個(gè)Commands的例子,可以通過F5運(yùn)行程序了。
三、程序的執(zhí)行順序
通過調(diào)試程序我們不難發(fā)現(xiàn)程序是按照以下順序執(zhí)行的:
1.通過入口程序CommandsApplication調(diào)用 new CommandsApplication().Run();
2.初始化TestForm
3.創(chuàng)建Shell后建立控件和命令的映射,執(zhí)行AfterShellCreated方法。
4.運(yùn)行MainWorkItem,激活主窗體。
文中完整代碼下載: /Files/hyphappy/TestUIBlock.rar
更多文章、技術(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ì)您有幫助就好】元
