当在控件内部点击文本时,用户控件的点击事件不起作用?

8
我有一个名为GameButton的用户控件,里面有一个标签。当我将用户控件添加到我的表单中,并给它添加一个点击事件时,当你点击自定义按钮的背景时,它会触发,但不是标签中的文本?我该如何修复这个问题,而不需要在用户控件的代码中添加大量的点击事件?(UI框架:WinForms)

UI框架(Winforms,WPF,Webforms,MVC)? - M.Babcock
请避免包含与您的问题几乎无关的标签(例如visual-studio)。 - M.Babcock
按照设计,Label控件会接收点击事件。你可以通过重写OnPaint()方法来规避这个问题,而不必使用Label作为解决方案。 - Hans Passant
不,标签不会响应事件,但背景会... - Oztaco
为什么您反对添加一个带有所有必要引用的单个事件处理程序?您甚至可以使用反射来分配事件处理程序。 - M.Babcock
5个回答

16
如果我理解正确,您的GameButton用户控件将在点击时触发事件,但在点击标签时不会触发事件--而您希望两者都会触发。这是因为标签(一个控件)位于背景上方。因此,您需要将标签注册到点击事件中。这可以在设计器中手动完成,也可以针对页面上的每个控件进行编程实现。
如果您想要在UserControl中处理每个控件,请将以下内容放入UserControl的OnLoad事件中,这样您就可以使用相同的点击事件来处理每个控件:
foreach (var c in this.Controls)
    c.Click += new EventHandler(yourEvent_handler_click);

public void yourEvent_handler_click (object sender, EventArgs e){
    //whatever you want your event handler to do
}

编辑:最好的方法是在用户控件中创建单击事件处理程序属性。这样,每当您向您的用户控件添加/删除单击事件时,它将自动添加/删除所有控件中的单击事件。

public new event EventHandler Click {
        add {
            base.Click += value;
            foreach (Control control in Controls) {
                control.Click += value;
            }
        }
        remove {
            base.Click -= value;
            foreach (Control control in Controls) {
                control.Click -= value;
            }
        }
    }

这是根据另一个帖子

希望这可以帮助!


我想要像在设计器中对普通按钮添加点击事件一样,对我的自定义按钮添加点击事件,但它们不会影响标签。 - Oztaco
我不确定我理解@EfeOzturkoglu的意思。您希望您的用户控件就像普通按钮一样,可以在任何地方单击并使用一个事件处理程序吗? - ImGreg
是的,就像我不想每次添加控件和其中的标签处理程序一样,只需在创建新按钮实例时添加一次即可。 - Oztaco

2

您可以创建一个新的方法并将所有控件分配给它

private void Control_Click(object sender, EventArgs e)
{
   this.OnClick(e);
}

这将触发主控件(或用户控件)事件。


谢谢您先生!!这是一个聪明的解决方案。 - moumouh206

1

将标签的“enable”属性设置为“False”,然后鼠标事件将在用户控件中起作用。


错误的解决方案,因为这也会使控件变灰。 - lolbas
它对我有效!我在我的用户控件中将所有子控件的启用设置为false! - FSRezende

1
您可以通过以下方式使用户控件中的控件事件调用用户控件事件:
foreach (Control c in this.Controls)
{
    c.Click += (sender, e) => { this.OnClick(e); };
    c.MouseUp += (sender, e) => { this.OnMouseUp(e); };
    c.MouseDown += (sender, e) => { this.OnMouseDown(e); };
    c.MouseMove+= (sender, e) => { this.OnMouseMove(e); };
}

只需将其放入构造函数中。这样,当使用多态向用户控件添加事件时,它将起作用。


0

enter image description here

这个控件有4个子控件,包括3个标签和1个图片框。 所以在点击事件中添加this.onClick(e)(在c#中)或Me.onClick(e)(在vb.net中) 就像这样

Private Sub rate_lab_Click(sender As Object, e As EventArgs) Handles rate_lab.Click
    Me.OnClick(e)
End Sub

在此输入图像描述 因此,无论在用户控件内单击何处,单击事件都将作为单个事件处理


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