c# - 我应该如何设置用户控件来触发其子项的事件,就好像它们是它自己的一样?

标签 c# .net winforms user-controls event-handling

换句话说,我有一个 UserControl,上面有一个标签。那么,当客户端注册到 UserControl 的 MouseMove 事件时,无论鼠标是在标签上还是在 UserControl 的其他地方,它都应该得到该事件。设置它的最佳方法是什么?

C#

最佳答案

我最喜欢以与您要求的方式类似的方式“传递”事件的技巧是记住事件的实现方式与属性类似 - 私有(private)委托(delegate)的包装器。您可以使用 addremove 覆盖此行为:(使用 new 显式隐藏 Control.MouseMove)

public new event EventHandler MouseMove {
    add { m_Label.MouseMove += value; }
    remove { m_Label.MouseMove -= value; }
}

请注意,可能有更好的方法来隐藏/覆盖 MouseMove 事件 - 通过查看反射器中的 Control 检查它是如何实现的,并查看是否有一个 Hook 可以覆盖以获取真正的基本 MouseMove 事件。当然,如果您不想隐藏基本的 MouseMove 事件,或者甚至不想做这样的事情,您的事件可以随意命名:

public new event EventHandler MouseMove {
    add {
        m_Label.MouseMove += value;
        base.MouseMove +=  value;
    }
    remove {
        m_Label.MouseMove -= value;
        base.MouseMove -= value;
    }
}

关于c# - 我应该如何设置用户控件来触发其子项的事件,就好像它们是它自己的一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772992/

相关文章:

c# - 我如何最小起订量 System.IO.FileInfo 类...或任何其他没有接口(interface)的类?

.net - 检测控制台窗口?

C#:如何获取列表框中所选项目(和文本)的索引

c# - NumericUpDown 控件应仅在滚动完成时触发 ValueChanged 事件

c# - 模拟对具有 List 类型属性的对象的调用

C# WinForms : Cannot increment when query result is null

c# - 如何使用 C#/.NET 代码获取 ClickOnce 应用程序路径和版本号?

c# - 如何将 asp.net "Login" View 放在布局页面上,而不是 @Html.Actionlink 到单独的登录页面?

c# - 如何判断另一个应用程序是否注册了 IPC Remoting channel ?

c# - 无法在 mvc 5 项目中添加新模型和更新数据库?