3

我有一个用户控件,它托管另一个控件,如面板、图表控件。

现在我已经实现了 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 线程,但它对鼠标单击或鼠标按下事件没有帮助。

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

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

提前致谢。

4

3 回答 3

4

在 WinForms 中没有像 HTML 或 WPF 那样冒泡事件的方法

如何从 WinForms 应用程序中用户控件上的子控件中获取事件?

所以你总是需要添加额外的代码。

于 2012-06-14T09:12:04.943 回答
1

有一种方法可以在没有太多代码的情况下编写它。您可以在隐藏现有处理程序的用户控件中创建自己的MouseDown事件处理程序,并在其中直接挂钩 UserControl 上的每个控件。例如,下面是包含 aPanel和 a的 UserControl 的 MouseDown 处理程序ListBox

// 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 中的调用必须MouseDown像这样为您的 UserControl 挂钩事件:

myUserControl1.MouseDown += myUserControl1_MouseDown;
于 2012-06-14T14:22:40.003 回答
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);
        }
    }
}
于 2012-06-14T09:26:49.910 回答