C# WinForms UserControl 鼠标事件帮助

3
我有一个为我的项目创建的自定义控件。在这个控件中,有几个子控件,如标签、图片框和链接标签。除了链接标签外,我希望鼠标悬停事件当前在父控件上,并且控件对鼠标悬停做出响应。当你悬停在控件上时,背景颜色会改变,但是当在子控件上时,背景颜色不会改变;这是因为子控件上没有 MouseEnter 和 MouseLeave 事件。我通过将父控件的委托方法添加到子控件中解决了这个问题。问题仍然存在,即当我订阅父控件上的单击事件时,子控件上的单击事件也被忽略了。我可以订阅每个单独的子控件,但是如何强制执行父控件的单击事件呢?我在搜索中找到的术语是事件冒泡,但这似乎只适用于 ASP.NET 技术和框架。有什么建议吗?
4个回答

2

根据您的描述,我认为您希望子控件和父控件都能响应子控件的点击事件。

如果我理解您的问题正确,我建议订阅子控件的点击事件,在这些事件处理程序中调用一些公共方法,以您所期望的方式操纵父UserControl的状态(例如,更改背景颜色)。


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))

1

看起来有人已经为我解决了这个问题。一个朋友解释说,C#控件支持一种名为InvokeOnClick(Control, EventArgs)的方法;

我将我的事件委托方法添加到每个子控件中,并为单击事件创建了一个单独的方法供每个子控件使用。这反过来调用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;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接