将子控件的点击事件传递给父控件

Posted

技术标签:

【中文标题】将子控件的点击事件传递给父控件【英文标题】:Pass click event of child control to the parent control 【发布时间】:2016-07-07 18:59:23 【问题描述】:

我有一个 Windows 窗体,有一个窗格,其中包含另一个从 Windows 窗体派生的类。这包含在窗格中作为控件。它本身包含两个按钮。

我希望将子控件的事件一直传递到父窗口。例如,窗格中的子窗口有一个Cancel 按钮,应该关闭它。我希望父控件,即主窗口也关闭,但是如何拦截子控件的按钮单击事件?

我可以修改子控件,但只有在没有其他方法以适当的方式实现这一点的情况下,我宁愿避免它。

【问题讨论】:

您为问题提供的描述与标题不同。你到底想要什么?单击子控件时是否要引发父窗体的单击事件?单击子控件中的按钮时是否要关闭父窗体?还是别的什么? 用户将点击子控件上存在的按钮-除了子控件上的一些事件外,甚至父控件也需要执行某些操作,但我不确定是不是最好的方法向父控件发出信号,并且在子控件上触发了某些事件。这些操作可以是一般操作,例如关闭所有表单,也可以是更复杂的操作。但是父级需要知道在属于子控件的控件上触发了一个事件。 虽然您可以直接从子窗体与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件。 【参考方案1】:

虽然您可以直接从子窗体与父窗体交互,但最好通过子控件引发一些事件并订阅父窗体中的事件。

从孩子引发事件:

public event EventHandler CloseButtonClicked;
protected virtual void OnCloseButtonClicked(EventArgs e)

    CloseButtonClicked.Invoke(this, e);

private void CloseButton_Click(object sender, EventArgs e)

    //While you can call `this.ParentForm.Close()` but it's better to raise the event
    //Then handle the event in the form and call this.Close()

    OnCloseButtonClicked(e);

注意:要引发 XXXX 事件,调用 XXXX 事件委托就足够了;创建protected virtual OnXXXX 的原因只是为了遵循模式让派生者覆盖方法并自定义引发事件之前/之后的行为。

在家长中订阅和使用事件:

//Subscribe for event using designer or in constructor or form load
this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked;

//Close the form when you received the notification
private void userControl11_CloseButtonClicked(object sender, EventArgs e)

    this.Close();

要了解有关活动的更多信息,请查看:

Handling and raising events Standard .NET event pattern

【讨论】:

谢谢你。我将检查是否可以修改子控件。 您能否描述一下我将放置“this.userControl11.CloseButtonClicked += userControl11_CloseButtonClicked”命令的位置?我最初在初始化组件命令之后将其放入,但它不会在那里捕获事件。 @tCoe 在 InitializeComponent 之后放置它是正确的,它应该可以工作。可能一开始根本没有引发该事件,因为您可能忘记将CloseButton_Click 分配给CloseButtonClick 事件。 对于更简单的代码方法,您可以在子类中执行以下操作:public event EventHandler CloseButtonClicked; private void btnOK_Click( object sender, EventArgs e ) CloseButtonClicked?.Invoke( this, e ); @ClausMøllerJørgensen 感谢您的反馈,是的,我们可以,特别是对于这部分CloseButtonClicked?.Invoke( this, e ); 但是......有OnCloseButtonClicked 是有原因的。遵循 .NET 的标准事件模式,并为开发人员提供了覆盖虚拟 OnCloseButtonClicked 方法的机会。

以上是关于将子控件的点击事件传递给父控件的主要内容,如果未能解决你的问题,请参考以下文章

scrollview添加手势 不影响子控件点击事件

响应者链条,如何获取最佳的点击view 以及内部实现

C# wpf父控件和子控件事件响应问题

如果子按钮被禁用,则停止将事件传递给父按钮

WPF 点击一个button之后处理别的控件的事件

iOS中事件的传递和响应者链条