C#自定义控件内多个控件的单击事件

Posted

技术标签:

【中文标题】C#自定义控件内多个控件的单击事件【英文标题】:C# Click event for multiple controls inside custom control 【发布时间】:2022-01-14 18:06:31 【问题描述】:

我正在尝试制作一个内部包含多个控件的自定义用户控件(对于本示例,一个图片框和一个标签),我希望它们都响应我在我所在的表单上所做的相同事件使用它,所有对象将是:

用户控件1 图片框1 标签1

但是,当我在要使用的表单(Form1)上进行(单击)事件时,该事件仅适用于背景(userCoontrol1),因此如果我单击图片框或标签,它将不起作用,怎么可能我让它事件适用于里面的每个控件?

我已经尝试为 userControl1 制作一个点击事件并将其应用于其他人并且有效,但我需要更改父级的行为,这就是为什么这不起作用,我不确定我是如何可以覆盖它。

【问题讨论】:

如果我理解正确,请告诉我。您希望单击表单中的任何按钮来对该表单中的对象执行一些更改(这些对象是用户控件、图片框和标签)? 更像,我想将我在表单中创建的 Click 事件分配给我的用户控件(而不是表单本身),并在我单击的任何位置(在用户控件内)激活单击操作,但如果我单击它不会说,用户控件内部的图片框编辑:想象我有一个按钮(那将是我的用户控件),当我单击按钮的彩色部分(背景)时它可以工作,但如果我没有点击按钮内的文字 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

考虑到您的评论...一种方法可能如下

将用户控件的单击事件链接到 form1,在 form1 代码中。假设您在 form1 中的函数称为 myButton_Click。

UserControl1.Click += new System.EventHandler(myButton_Click);

然后在 UserControl1 中创建一个单击事件(比如说“Control_Click”),它只调用 UserControl1.Click 事件处理程序。

private void Control_Click(object sender, EventArgs e)

    Click?.Invoke(this, new EventArgs());

最后将用户控件中每个控件的点击链接到用户控件构造函数中的那个 Control_Click 事件

picturebox1.Click += new System.EventHandler(Control_Click);
label1.Click += new System.EventHandler(Control_Click);

【讨论】:

谢谢,但是是的,我已经尝试过了,事实上,所有辅助控件都在“Usercontrol1”内初始化,这就是为什么该解决方案虽然有效,但不适用于这种特殊情况,我此时可能只是选择带有控件而不是自定义控件的面板,但只是为了获得一些额外的细节,例如,这里有一些图片。编辑:忘记链接* imgur.com/a/wwKmr3S 我想我找到了一种方法,通过公开一个子控件,我可以在表单上分配它的事件,这几乎就像你的提议,仍然不是我想要的方式,但至少作品。我认为主要思想而不是“将事件分配给一切”更多的是:无论我在哪里点击,点击都有效,其他控件是否可能只是忽略点击并传递给“userControl1”? 我确实考虑过,但很高兴我选择了这条路线,因为它可能更符合您的期望 可选的“Invoke(this,”可能是“Invoke(sender,”..取决于您是否需要访问发送它的特定项目..但我猜不是这里 我刚刚找到了一个解决方案,比我想象的要容易......写以防万一其他人也需要同样的东西:我只需要禁用每个子控件(因为我不需要它们)和通过这样做,单击时它们将被忽略,并且单击本身将转到控件后面的层,这就是我所需要的,现在当在窗体上添加事件时,无论我单击何处,它都会起作用,简直不敢相信就是这样......无论如何,谢谢你的帮助

以上是关于C#自定义控件内多个控件的单击事件的主要内容,如果未能解决你的问题,请参考以下文章

c# 为自定义控件添加鼠标双击事件

如何在自定义用户控件上创建单击事件?

c# winform 制作自定义控件

C#自定义控件的鼠标事件问题

winform 动态生成自定义控件添加单击事件无效

winform 自定义控件的使用