2008-10-07 102 views
3

我有我爲我的項目創建的自定義控件。在這個控件中有幾個子控件,比如一個Label,一個PictureBox和一個LinkLabel。其他的則是LinkLabel,我希望鼠標懸停在父控件上,並讓鼠標懸停在鼠標上。當您將鼠標懸停在控件上時,背景顏色會發生變化,但在子控件上時背景顏色不會更改;這是因爲子控件上沒有MouseEnter和MouseLeave事件。我通過將父控件委託方法添加到子控件來解決此問題。問題仍然是,當我訂閱了父控件上的click事件時,click事件也會在子控件上被忽略。我可以訂閱每個單獨的子控件,但是如何強制執行父控件的單擊事件?我通過搜索找到的術語是「事件冒泡」,但這似乎只適用於ASP.NET技術和框架。有什麼建議麼?C#WinForms UserControl鼠標事件幫助

回答

2

您的描述讓我相信您希望您的孩子和您的父母控件都能夠響應對子控件的點擊。

如果我正確理解你的問題,我會建議訂閱你的子控件的單擊事件,並在那些事件處理程序中調用一些常用的方法,以你想要的方式操縱父UserControl的狀態(例如,改變背景顏色)。

1

似乎有人爲我解決了它。一位朋友解釋說C#控件支持一種名爲InvokeOnClick(Control,EventArgs)的方法;

我向每個子控件添加了我的事件委託方法,對於click事件,我爲每個要使用的子控件創建了一個方法。這又會調用InvokeOnClick(this,new EventArgs());


private void Control_Click(object sender, EventArgs e) 
{ 
    // this is the parent control. 
    InvokeOnClick(this, new EventArgs()); 
} 

private void IFLVControl_MouseEnter(object sender, EventArgs e) 
{ 
    this.BackColor = Color.DarkGray; 
} 

private void IFLVControl_MouseLeave(object sender, EventArgs e) 
{ 
    this.BackColor = Color.White; 
} 
1

我也有類似的問題,在所有子控件處理Click事件。代碼是VB.NET,但它應該很容易調整。

Public Shared Sub RelayEvents(ByVal usrcon As Windows.Forms.Control, ByVal del As System.EventHandler, Optional ByVal includeChildren As Boolean = True) 
    For Each con As Windows.Forms.Control In usrcon.Controls 
     AddHandler con.Click, del 
     If includeChildren Then 
      RelayEvents(con, del) 
     End If 
    Next 
End Sub 

無論何時需要所需的級聯,可將以下行添加到類的構造函數中。

CustomMethods.RelayEvents(Me, New EventHandler(AddressOf Me_Click))