我有一个为项目创建的自定义控件。在此控件中有几个子控件,如Label,PictureBox和LinkLabel。除了LinkLabel之外,我希望当前在父控件上的鼠标悬停事件并让控件响应鼠标。将鼠标悬停在控件上时背景颜色会发生变化,但是当通过子控件时背景颜色不会改变;这是因为子控件上没有MouseEnter和MouseLeave事件。我通过将父控件委托方法添加到子控件来解决了这个问题。问题仍然是当我订阅了我的父控件上的click事件时,click控件上的click事件也会被忽略。我可以订阅每个单独的子控件,但是如何强制父控件的click事件?我通过搜索找到的术语是Event Bubbling,但这似乎只适用于ASP.NET技术和框架。有什么建议吗?
答案 0 :(得分:2)
您的描述让我相信您希望您的孩子和您的父母控件都能响应对儿童控件的点击。
如果我理解你的问题,我建议订阅你的子控件'click事件,并在那些事件处理程序中调用一些常用的方法来按照你想要的方式操纵父UserControl的状态(例如,改变背景颜色。)
答案 1 :(得分: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;
}
答案 2 :(得分: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))
答案 3 :(得分:0)
Peter Rilling在CodeProject上有一些简单有效的代码,用于在winforms(和C#)中进行事件冒泡/广播。它真的很容易使用。