4.公布控件屬性
因為要把時間寫入Label的Text屬性中,所以我們需要把label1.Text屬性公開。請在TimeLabel類中加入以下代碼:
public string LabelText
{
get
{
return label1.Text;
}
}
注意,這裡我們不需要讓控件使用者改變label1.Text的值,所以LabelText是個只讀屬性。
另外,出於美觀的考慮,我們這裡還要向控件使用者公開一個LabelBackColor屬性,用於獲得和設置Label的BackColor屬性。代碼如下:
public Color LabelBackColor
{
get
{
return label1.BackColor;
}
set
{
label1.BackColor=value;
}
}
當然,你也可以根據需要再增加一些屬性,如字體、控件大小等,讓控件使用者可以更加靈活地使用控件。
到這裡,我需要向大家補充一點,復合控件創建中的很重要的一條是:任何構成控件(Constituent Control)的屬性必須要通過加入復合控件的屬性來公開,而不要直接把構成控件直接以public級別公開。比如說上面,我們就不應把Label控件的訪問級別設為public來直接公開(默認是private)。這樣作的目的是讓我們能更好地把握控件的數據安全,從而只把那些最需要的屬性公開給控件用戶。
5.時間顯示的處理。
到現在,我們就可以增加代碼來讓我們的控件顯示時間了。首先請把timer1的Interval屬性設為1000,也就是1秒的時隔。然後雙擊timer1,在其Tick事件處理過程中增加以下代碼:
label1.Text=System.DateTime.Now.ToLongTimeString();
這樣,每隔一秒鐘,我們的Label就會重新顯示當前系統時間。最後,請雙擊TimeLabel控件上的空白處,在出現的TimeLabel_Load事件處理過程中增加以下代碼來激活Timer:
timer1.Enabled=true;
這樣,Timer就會忠心耿耿地開始計算時間,並更新Label上的時間文字了。
6.事件處理。
由於是繼承自UserControl的控件,所以TimeLabel從一開始便擁有了Click、DragDrop、FontChanged等事件。我們現在要做的是增加一個自定義事件——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 timer1_Tick(object sender, System.EventArgs e)
{
label1.Text=System.DateTime.Now.ToLongTimeString();
OnTick(e);
}