如何检查鼠标单击是否在用户控件中而不处理子控件事件?

时间:2012-06-14 07:55:10

标签: .net winforms

我有一个用户控件来托管其他控件,如面板,图表控件。

现在我已经实现了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); 

Capture mouseclick event

我经历了这个SO thread,但它对鼠标点击或鼠标按下事件没有帮助。

那么捕获用户控制鼠标事件的正确有效方法是什么?

任何有关参考代码(如果可能)的想法或建议都将被接受。

提前致谢。

3 个答案:

答案 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上的每个控件。例如,这是包含PanelListBox的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);
        }
    }
}