2008-10-07 64 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))