熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用Visual C# .NET開發簡單的復合控件

2013-11-13 10:19:05  來源: .NET編程 

  內容提要

  本文介紹如何用Visual C# NET 開發簡單的復合控件(Composite Control)主要講解控件開發過程中的屬性(Property)和事件(Event)處理以方便開發人員在NET平台下根據自己的需要開發適合的控件

  當我們在NET平台下做Windows Forms開發時常常需要為了某一特殊用途而把現有控件結合起來使用比如結合了Label和TextBox的控件就非常容易在窗體上布局(記得Delphi 裡就有這麼個控件)而結合了特定圖案和文字的控件則非常適合顯示公司的logoNET平台就為我們提供了非常棒的工具和技術來創建這樣的自定義控件下面讓我們來一起創作一個可以自動顯示時間的控件

值得注意的是NET平台為我們提供了三種控件的開發技術分別是繼承控件(Extended Control)復合控件(Composite Control)和自定義控件(Custom Control)(譯名可能會有所不同大家可以以英文為准)我們現在關心的是第二種——復合控件OKLets go!

.創建控件工程

  在Visual C# NET中新建一個Windows控件庫項目命名為TimeLabel

.更改命名空間控件類名稱

  默認的命名空間是TimeLabel(和項目名稱一樣)控件類名稱是UserControl請把命名空間改為與你的開發習慣一致如我的是LeoYangControlsTimeLabel當然你也可以選擇保留默認命名空間最好把控件類名稱改為有意義的命名如TimeLabel這樣當該控件出現在工具箱上時就會顯示為TimeLabel而不是UserControl注意一旦改動類名則相應的Construction方法名稱也要相應改掉

public UserControl()

{



}

就要改為

public TimeLabel()

{



}

  .添加現有控件

  由於我們是要在現有控件的基礎上創建新控件所以就應該先把可用的現有控件添加到控件設計界面上請在工具箱中雙擊Label再雙擊Timer兩個現有控件依次被添加到我們的設計界面上如圖

用Visual C# .NET開發簡單的復合控件(圖一)

   

  .公布控件屬性

  因為要把時間寫入Label的Text屬性中所以我們需要把labelText屬性公開請在TimeLabel類中加入以下代碼

public string LabelText

{

get

{

return labelText;

}

}

注意這裡我們不需要讓控件使用者改變labelText的值所以LabelText是個只讀屬性

另外出於美觀的考慮我們這裡還要向控件使用者公開一個LabelBackColor屬性用於獲得和設置Label的BackColor屬性代碼如下

public Color LabelBackColor

{

get

{

return labelBackColor;

}

set

{

labelBackColor=value;

}

}

當然你也可以根據需要再增加一些屬性如字體控件大小等讓控件使用者可以更加靈活地使用控件

到這裡我需要向大家補充一點復合控件創建中的很重要的一條是任何構成控件(Constituent Control)的屬性必須要通過加入復合控件的屬性來公開而不要直接把構成控件直接以public級別公開比如說上面我們就不應把Label控件的訪問級別設為public來直接公開(默認是private)這樣作的目的是讓我們能更好地把握控件的數據安全從而只把那些最需要的屬性公開給控件用戶

  .時間顯示的處理

  到現在我們就可以增加代碼來讓我們的控件顯示時間了首先請把timer的Interval屬性設為也就是秒的時隔然後雙擊timer在其Tick事件處理過程中增加以下代碼

labelText=SystemDateTimeNowToLongTimeString();

  這樣每隔一秒鐘我們的Label就會重新顯示當前系統時間最後請雙擊TimeLabel控件上的空白處在出現的TimeLabel_Load事件處理過程中增加以下代碼來激活Timer

timerEnabled=true;

這樣Timer就會忠心耿耿地開始計算時間並更新Label上的時間文字了

.事件處理

  由於是繼承自UserControl的控件所以TimeLabel從一開始便擁有了ClickDragDropFontChanged等事件我們現在要做的是增加一個自定義事件——Tick以便通知使用我們控件的窗體時間已經改變了因為我們只需要簡簡單單地讓這個事件發生所以不需創建我們自己的代理(delegate)函數也不需創建特殊的事件處理事據對象OK請看下面的代碼

首先在TimeLabel類裡增加Tick事件聲明

public event EventHandler Tick;

然後給該事件編寫一個調用過程請注意該過程的命名

protected void OnTick (EventArgs e)

{

if(Tick!=null)

{

Tick(this e);

}

}

另外在上面處理過的Timer的Tick事件處理過程中還應增加對OnTick的調用代碼如下

private void timer_Tick(object sender SystemEventArgs e)

{

labelText=SystemDateTimeNowToLongTimeString();

OnTick(e);

}

   

  .創建試驗項目

  在Visual C# NET中通過文件添加項目新建項目創建一個新的Windows應用程序命名為TestTimeLabel並添入當前解決方案中如圖

用Visual C# .NET開發簡單的復合控件(圖二)

  .添加控件引用

  在使用自定義控件之前我們必須把控件添加到工具箱方法是右擊工具箱點選自定義工具箱在彈出的自定義工具箱對話框中選擇NET框架組件然後點擊浏覽定位並打開我們剛才所創建的TimeLabel控件專有程序集(TimeLabeldll)使該控件出現在NET框架組件列表中如圖所示

用Visual C# .NET開發簡單的復合控件(圖三)

  點擊確定即可把TimeLabel控件添加到工具箱如圖所示

用Visual C# .NET開發簡單的復合控件(圖四)

  .使用控件

  現在我們就可以把我們創建的TimeLabel像其它控件一樣拖放到Windows窗體上設置它的屬性和響應它的事件了比如可以在屬性窗口中設置TimeLabel的LabelBackColor為你喜歡的顏色當然除LabelBackColor以外還有大量的屬性可供設置而且如果大家願意還可以回到TimeLabel項目中再用上面說過的方法增加其它的屬性從而使控件功能和用戶界面更加豐富

  .響應事件

  前面我們給TimeLabel增加了一個Tick事件每當時間顯示改變之後發生那麼我們的程序怎樣知道Tick事件已經發生並對它做出反應呢?方法如下

首先增加事件處理過程如下(名稱可以自定但必須要有object和EventArgs類型的參數並且以void類型返回)

private void TickHandler(object sender EventArgs e)

{

SystemDiagnosticsDebugWriteLine(timeLabelLabelText);

}

其次在FormInitializeComponent過程中把上述過程注冊給TimeLabel的Tick事件

thistimeLabelTick+=new EventHandler(thisTickHandler);

這樣我們的試驗項目就已經完成可以調試了試驗程序啟動界面如圖

用Visual C# .NET開發簡單的復合控件(圖五)

  同時在調試器的輸出窗口中每隔一秒都會有一條新的Debug記錄寫入內容是TimeLabel的LabelText屬性(即所顯示的時間)這說明我們的事件處理成功了

後記本文通過一個簡單的demo演示了如何使用Visual C# NET創建一個簡單的復合控件大家可以按照項目或學習的實際需要來把這個例子進一步完善(比如說可以給控件增加自定義的圖標等)


From:http://tw.wingwit.com/Article/program/net/201311/13228.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.