天天看點

探讨ASP.NET 2.0中的Web控件改進技術(3)

當你最開始在Visual Studio 2005中使用Windows表單控件或是ASP.NET Web控件時,你首先會注意到,在許多控件右上角出現一個箭頭形狀的小玩意兒(見圖2中的示例)。點選這個箭頭會彈出一個小視窗,其中包含該控件的一些屬 性,還有一兩個連結。微軟設計這些靈敏标簽是為了顯示你需要操作的一些屬性,其最終目的是為了使該控件在一個頁面或表單上能夠正确工作;并且你将注意到, 它們比一個普通的快捷菜單更為精緻。本節中我們讨論的内容既适用于Windows表單控件也适用于ASP.NET伺服器控件。

  

探讨ASP.NET 2.0中的Web控件改進技術(3)

  圖2.EmailContact控件的靈敏标簽

  為了建構你自己的靈敏标簽,你需要使用一個控件設計器類。事實上,你在另外其它一些問題上也會使用這個類。但是,在我詳細讨論設計器類前,我想先建立一個ActionList類—這個類将定義我的靈敏标簽中包含的元素。

  一個ActionList類繼承自System.ComponentModel.Design命名空間中的 DesignerActionList類。但是,在詳細讨論這個類之前,讓我先來解釋一下存在于靈敏标簽中的四種類型的元素:category header,property mapping,action link以及information item。圖2展示了我建構這個靈敏标簽的目标。你能夠從中看出我所指的這四種類型的元素嗎?我把這個靈敏标簽根據标題分為三類:“Appearance & Behavior”,“Support”和“Information”。其中,“Appearance & Behavior”分類中包含了兩個屬性:Mail Server和Pre-defined Display。這些實際上都是EmailContact控件本身的屬性。“Support”分類包含兩個激活某些類型的一個行為的連結,而 “Information”分類僅用于顯示資訊。現在,有了這四種類型的元素,我将着手建立我的ActionList類。

  我将建立一個稱為EmailContactActionList的類,并且從DesignerActionList中加以派生。(你可以在本文 源碼清單1中看到完整的類)。我将建立一個構造器—它接收一個EmailContact執行個體作參數并且把它的範圍擴大到一個稱為 ctlEmailContact的類級變量。後面,當我把代碼添加到設計器類時,你将看到這個構造器的使用情況。現在,我已經建立了一個類級的對象,它包 含我正在設計的Web控件的執行個體。

  接下來,我将建立靈敏标簽将顯示的屬性的“property mapping”。在圖2中,你看到我已經在該靈敏标簽中标出了兩個屬性:MailServer和PreDefinedDisplay。這些将分别映射到 EmailContact控件的稱為MailServer和PreDefinedDisplay的屬性上。ActionList類中的屬性映射将在get 存取器中傳回控件的屬性,而在set存取器中設定控件的屬性。然而,由于微軟設計ActionList基礎結構的方式決定了,你不能直接設定該控件的屬 性。而是,你必須使用反射機制來存取該控件的屬性,然後再設定它的值。為了友善這一實作,我編寫了一個稱為GetControlProperty的方法, 它能夠傳回一個PropertyDescriptor對象。這樣以來,開發者就不需要再重複每一種屬性映射下的反射編碼。下面是一個屬性映射看起來的樣 子。

以下是引用片段:

Public Property MailServer() As String 

Get 

Return ctlEmailContact.MailServer 

End Get 

Set(ByVal value As String) 

GetControlProperty("MailServer"). _ 

SetValue(ctlEmailContact, value) 

End Set 

End Property

  接下來,我需要建立的是你在圖2中所看到的連結:“About EmailContact”和一個到我自己的網站的連結。這些連結将執行我将在這個類中建立的方法。我的第一個方法名為ShowAboutBox,它顯示 一個Windows表單以用作我的控件的一個“關于”資訊提示視窗。第二個方法稱為LaunchWebSite,它執行一個對 System.Diagnostics.Process.Start的調用以便在一個浏覽器執行個體中啟動我的網站。這兩個方法的唯一的要求是:每一個簽名都 必須是一個“Sub”(在C#語言中相應于一個void函數)并且不帶參數。

  注意,在這個靈敏标簽示例中僅顯示了兩個屬性和兩個連結,但是借助于我剛才所展示的技術,你完全可以提供你所需要的盡可以多的這些對象。然而, 我建議:不要使用太多的資訊來重載一個靈敏标簽。記住,你僅想把資訊放于此以便頁面開發者立即使用,進而使得Web控件開發更具直覺性。

  現在,既然我已經建立了我的屬性映射和行為方法,那麼接下來,我将建立靈敏标簽的内容。其中,DesignerActionList類提供一個 稱為GetSortedActionItems的重載函數。以後,一個設計器類将重載這個函數,并且它會傳回一個 DesignerActionItemCollection(定義于System.ComponentModel.Design命名空間)類型的對象。

  這個屬性重載的實作部分将建立一個新的DesignerActionItemCollection對象并且使用四個不同的類 (DesignerActionHeaderItem,DesignerActionPropertyItem, DesignerActionMethodItem和DesignerActionTextItem)的執行個體來填充它。注意,這四個類都派生自抽象 DesignerActionItem類。下面,我将同你逐個展開讨論。

Dim o_Items As DesignerActionItemCollection = _ 

New DesignerActionItemCollection

  這段代碼使用DesignerActionHeaderItem類來建立靈敏标簽分類頭部,并且在它們的構造器中接收分類名字。我将直接把這個類的執行個體插入到我剛才建立的集合中。

o_Items.Add(New DesignerActionHeaderItem( _ 

"Appearance & Behavior"))

  為每一種分類建立準确的标題是相當重要的,這不僅是因為它作為在靈敏标簽中作為該分類的頭部相應的顯示文本這一用途。早些時候,我建立了兩個分 别稱為MailServer和PreDefinedDisplay的屬性映射;現在我想把它們添加到靈敏标簽中。為此,我将建立 DesignerActionPropertyItem類的執行個體并且把它們添加到集合中。

o_Items.Add(New DesignerActionPropertyItem( _ 

"MailServer", "Mail Server", _ 

  注意,該構造器接收三個參數:屬性名,将出現在靈敏标簽上的文本資訊,以及相應類型的準确标題(在DesignerActionHeaderItem的執行個體中定義)。

  接下來,我想以相同的方式把行為連結添加到靈敏标簽。注意,也僅僅是在此時,我們使用了DesignerActionMethodItem類的執行個體。

o_Items.Add(New DesignerActionMethodItem( _ 

Me, "ShowAboutBox", "About EmailContact2", _ 

"Support", "Displays the about box.", True))

  在此,構造器接收方法名,連結說明,類型文本以及一個用作連結的提示資訊的描述等共四個參數。其中,第四個參數決定這個連結是否還出現在屬性浏覽器的底部。

  最後,我将把資訊項添加到靈敏标簽中—這是使用DesignerActionTextItem類來實作的。

o_Items.Add(New DesignerActionTextItem( _ 

"ID: " & ctlEmailContact.ID, "Information"))

  在此,構造器僅接收要顯示的文本和該文本要放置的類型。

  清單1(見源碼檔案)中的最終代碼展示了我要添加到這個集合中的所有項。當該方法完成時,它簡單地傳回這個集合。在後面一篇中,我們将讨論控件設計器類的問題。

本文轉自朱先忠老師51CTO部落格,原文連結: http://blog.51cto.com/zhuxianzhong/59764,如需轉載請自行聯系原作者

繼續閱讀