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
























?
修改時要注意將static class 修改成 class,否則無法通過編譯,提示類似錯誤1所示的錯誤信息
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,也會無法通過編譯,提示類似錯誤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。
??? 錯誤1很好理解,就是靜態(tài)的類無法從類型繼承,但是錯誤2就讓我有些費解,在CAB的Quick Start中就是這樣寫的。和我新建立的不同區(qū)別是,我是通過引用dll來添加引用的,Quick Start是直接引用解決方案中的項目。查閱MSDN幫助對Inconsistent accessibility的解釋,好像也不能解釋我遇到的這個問題。
還有就是要將static void Main()修改成 public static void Main(),同時刪除VS2005默認生成的代碼。
6.建立Controller,也就是命令。通常業(yè)務(wù)行為都放到這個類里。
???? 新建類MainControler文件,將類MainControler從Controller繼承。
???? 編寫過程,并且以屬性[CommandHandler(strKey)]進行修飾,其中strKey是Commands集合中注冊的命令關(guān)鍵字。示例過程寫法如下:
?







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


























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











???? 這里是通過菜單項的名稱和命令的名稱進行映射的。我們也可以將多個控件的事件映射到同一個命令如:







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



?
??? 我曾經(jīng)嘗試通過同樣的方法在一個Panel中加入一個Button,但是失敗了,原因是沒有注冊對應(yīng)的UIElementManagerFactory。
9.至此我們已經(jīng)做好了一個Commands的例子,可以通過F5運行程序了。
三、程序的執(zhí)行順序
通過調(diào)試程序我們不難發(fā)現(xiàn)程序是按照以下順序執(zhí)行的:
1.通過入口程序CommandsApplication調(diào)用 new CommandsApplication().Run();
2.初始化TestForm
3.創(chuàng)建Shell后建立控件和命令的映射,執(zhí)行AfterShellCreated方法。
4.運行MainWorkItem,激活主窗體。
文中完整代碼下載: /Files/hyphappy/TestUIBlock.rar
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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