具有多个控件的用户控件处理单击
User Control with multiple controls handle click
我有一个用户控件,上面有 3 个标签。我希望在 canvas 上的任意点单击控件时引发父窗体上的单击事件,即使在标签中也是如此。它就像一个带有 3 个标签的按钮...现在它只会在单击基础 canvas 部分时引发父事件,但在单击标签时不会冒泡。
首先,在构造函数中我分配了事件处理程序:
public partial class RunCodeButton : UserControl
{
public event EventHandler ButtonClick;
public RunCodeButton()
{
InitializeComponent();
LblCode.Click += RunCodeButton_Click;
LblCount.Click += RunCodeButton_Click;
LblDescription.Click += RunCodeButton_Click;
}
}
然后我将用户控件的点击事件添加到 class:
private void RunCodeButton_Click(object sender, EventArgs e)
{
ButtonClick?.Invoke(this, e);
}
然后,在主窗体(不是用户控件)中,我在生成按钮时添加点击事件:
_button.Click += Button_Click;
private void Button_Click(object sender, EventArgs e)
{
Result = DialogResult.OK;
RunCode = (Codes_Run)((RunCodeButton)sender).Tag;
Close();
}
如果我在用户控件的点击事件中设置一个断点,然后点击一个标签。它引发了事件,但 'ButtonClick' 始终为 null,它就停在那里。
有没有办法让用户控件的子控件点击事件冒泡?
添加
_button.ButtonClick += Button_Click;
绕行
_button.Click += Button_Click;
虽然你甚至不需要_button.ButtonClick
。简单地做
private void RunCodeButton_Click(object sender, EventArgs e)
{
Click?.Invoke(this, e);
}
我有一个用户控件,上面有 3 个标签。我希望在 canvas 上的任意点单击控件时引发父窗体上的单击事件,即使在标签中也是如此。它就像一个带有 3 个标签的按钮...现在它只会在单击基础 canvas 部分时引发父事件,但在单击标签时不会冒泡。 首先,在构造函数中我分配了事件处理程序:
public partial class RunCodeButton : UserControl
{
public event EventHandler ButtonClick;
public RunCodeButton()
{
InitializeComponent();
LblCode.Click += RunCodeButton_Click;
LblCount.Click += RunCodeButton_Click;
LblDescription.Click += RunCodeButton_Click;
}
}
然后我将用户控件的点击事件添加到 class:
private void RunCodeButton_Click(object sender, EventArgs e)
{
ButtonClick?.Invoke(this, e);
}
然后,在主窗体(不是用户控件)中,我在生成按钮时添加点击事件:
_button.Click += Button_Click;
private void Button_Click(object sender, EventArgs e)
{
Result = DialogResult.OK;
RunCode = (Codes_Run)((RunCodeButton)sender).Tag;
Close();
}
如果我在用户控件的点击事件中设置一个断点,然后点击一个标签。它引发了事件,但 'ButtonClick' 始终为 null,它就停在那里。
有没有办法让用户控件的子控件点击事件冒泡?
添加
_button.ButtonClick += Button_Click;
绕行
_button.Click += Button_Click;
虽然你甚至不需要_button.ButtonClick
。简单地做
private void RunCodeButton_Click(object sender, EventArgs e)
{
Click?.Invoke(this, e);
}