我有一个用户控件来托管其他控件,如面板,图表控件。
现在我已经实现了Header Panel控件的MouseClick事件来捕获鼠标事件,但我需要在整个用户控制区域捕获鼠标单击或mouseDown事件。
pnlHeader.MouseUp += new MouseEventHandler(pnlHeader_MouseUp); //it is working
//Not able to capture because child control coverup all area of the usercontrol.
this.MouseDown += new MouseEventHandler(MyCustomControl_MouseDown);
我经历了这个SO thread,但它对鼠标点击或鼠标按下事件没有帮助。
那么捕获用户控制鼠标事件的正确有效方法是什么?
任何有关参考代码(如果可能)的想法或建议都将被接受。
提前致谢。
答案 0 :(得分:4)
在WinForms中无法像在HTML或WPF中那样冒泡事件
How do I grab events from sub-controls on a user-control in a WinForms App?
所以你总是需要添加额外的代码。
答案 1 :(得分:1)
有一种方法可以在没有这么多代码的情况下编写它。您可以在用户控件中创建自己的MouseDown
事件处理程序,该处理程序隐藏现有处理程序并直接挂钩UserControl上的每个控件。例如,这是包含Panel
和ListBox
的UserControl的MouseDown处理程序:
// MouseDown event handler within UserControl
public new event MouseEventHandler MouseDown
{
add
{
panel1.MouseDown += value;
listBox1.MouseDown += value;
}
remove
{
panel1.MouseDown -= value;
listBox1.MouseDown -= value;
}
}
如果你的UserControl有更多控件,你只需将它们添加到每个部分。
您在父级WinForm中的调用必须为您的UserControl挂钩MouseDown
事件,如下所示:
myUserControl1.MouseDown += myUserControl1_MouseDown;
答案 2 :(得分:0)
namespace WindowsFormsApplication1
{
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.OnUCMouseUp += new MouseEventHandler(UserControl1_OnUCMouseUp);
panel1.MouseUp += new MouseEventHandler(panel1_MouseUp);
}
void UserControl1_OnUCMouseUp(object sender, MouseEventArgs e)
{
MessageBox.Show("From userControl");
}
void panel1_MouseUp(object sender, MouseEventArgs e)
{
InvokeMouseUp(this, e);
}
public event MouseEventHandler OnUCMouseUp;
protected void InvokeMouseUp(object sender, MouseEventArgs e)
{
if (this.OnUCMouseUp != null)
this.OnUCMouseUp(sender, e);
}
}
}