问题描述
这个题目听上去有点绕,不知道该如何描述。如下图,根据需求自定义了一个用户控件(UserControl),除了用户控件本身外,上面还有一个标签控件(labelControl)和图片控件(pictureEdit)。
它们三者各自有一个单击事件(Click),现用户控件的单击Click事件只能在"非控件区"触发有效,显示我们需要在用户控件所有位置单击都触发单击事件。
解决方案
最容易想到的方法是让用户控件的上所有控件都去注册同一个单击事件,这是最简单的方法也是"笨"的方法。正确的方式是在用户控件自定义一个事件来实现。
首先,在用户控件内定义一个用户控件事件(ButtonClick),方便用户调用实现:
public event EventHandler ButtonClick;
再在用户控件的构造函数中实现三个事件,并绑定到同一事件中:
this.Click += BigButton_Click; this.pictureEdit1.Click += BigButton_Click; this.labelControl1.Click += BigButton_Click;
BigButton_Click中触发它的Click事件:
private void BigButton_Click(object sender, EventArgs e) { ButtonClick?.Invoke(this, e); }
最后用户在使用用户控件时,注册并实现用户控件的ButtonClick事件,用ButtonClick事件完成原来Click事件的任务即可。