亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Composite UI Application Block 學習筆記之Com

系統(tǒng) 1862 0

?? 聽了曹嚴明先生的《組合型智能客戶端應(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)容修改成以下形式:

using ?System;
using ?System.Collections.Generic;
using ?System.Windows.Forms;
using ?Microsoft.Practices.CompositeUI;
using ?Microsoft.Practices.CompositeUI.Commands;
using ?Microsoft.Practices.CompositeUI.WinForms;
using ?Microsoft.Practices.CompositeUI.UIElements;
class ?CommandsApplication?:?FormShellApplication < MainWorkItem,?TestForm >
{
/// ? <summary>
/// ?The?main?entry?point?for?the?application.
/// ? </summary>

[STAThread]
public ? static ? void ?Main()
{
??
new ?CommandsApplication().Run();
}

}


?

修改時要注意將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)鍵字。示例過程寫法如下:


?

[CommandHandler( " AddNew " )]
public ? void ?AddNewFileHandler( object ?sender,?EventArgs?e)
{
??MessageBox.Show(
" You?Had?Added?A?File " );
}


?

7.建立WorkItem。

??? 新建類MainWorkItem,并且從WorkItem繼承。

?? 重載Run()方法,代碼如下所示:


?

using ?System;
using ?System.Windows.Forms;
using ?System.Collections.Generic;
using ?Microsoft.Practices.CompositeUI;
using ?Microsoft.Practices.CompositeUI.UIElements;
using ?Microsoft.Practices.CompositeUI.WinForms;
using ?Microsoft.Practices.ObjectBuilder;
using ?System.Text;

namespace ?TestUIBlock
{
?
class ?MainWorkItem:WorkItem
?
{
??
public ? override ? void ?Run()
??
{
????Items.AddNew
< MainControler > ();
????Activate();}

??}

?}

}

?

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

??? 8.建立菜單項到Commands的映射。

??? 建立方法ProcessCommandMap(IUIElementService uiService):


?

private ? void ?ProcessCommandMap(IUIElementService?uiService)
{

foreach ?(ToolStripMenuItem?item? in ?((ToolStripMenuItem)Shell.MainMenuStrip.Items[ " FileMenue " ]).DropDownItems)
{
??
this .RootWorkItem.Commands[item.Name].AddInvoker(item,? " Click " );
}


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

Button?btn1? = ? new ?Button();
btn1.Text?
= ? " test " ;
btn1.Name?
= ? " btn1 " ;

Panel?panel1?
= ?(Panel)Shell.Controls[ " panel1 " ];
panel1.Controls.Add(btn1);
this .RootWorkItem.Commands[ " AddNew " ].AddInvoker(btn1,? " Click " );

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

IUIElementService?uiService? = ?RootWorkItem.Services.Get < IUIElementService > ();
ToolStripMenuItem?fileItem?
= ?(ToolStripMenuItem)Shell.MainMenuStrip.Items[ " File " ];
uiService.RegisterUIExtensionSite(
" File " ,?fileItem.DropDownItems);

?

??? 我曾經(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

Composite UI Application Block 學習筆記之Commands


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天摸天天操天天爽 | 四虎影视成人永久在线观看 | 成人免费视频网站 | 欧美亚洲图片 | 久久精品国产99国产 | 高清一区二区 | a级毛片毛片免费观看久潮 a级毛片免费 | 91国内精品线免费播放 | 日本在线一卡二卡毛片 | 久久久久免费精品视频 | 国产精品爱啪在线线免费观看 | 欧美不卡影院 | 日韩午夜网站 | 欧美激情精品久久久久久久久久 | 欧美资源站 | 日日操夜夜爱 | 日韩不卡一区二区三区 | 99v视频国产在线观看免费 | 亚洲日日操 | 性生活视频网址 | 欧美高清无砖专区欧美精品 | 国产成人精品曰本亚洲78 | 在线欧美精品一区二区三区 | 在线免费观看毛片 | 久草在线手机 | 久青草国产手机视频免费观看 | 久久精品首页 | 高清国产一区二区 | 色婷婷亚洲十月十月色天 | 99re这里只有精品66 | 黄色综合网站 | 997在线观看视频国产 | 亚洲狠狠色丁香婷婷综合 | 亚洲 激情 | 欧美国产精品不卡在线观看 | 色综合色综合色综合色综合网 | 特级毛片在线大全免费播放 | 久久九九精品视频 | 国产在线观看91 | 久久99国产亚洲精品 | 久久国产精品夜色 |