检测用户控件上的鼠标和所有子项 - C#WinForms

时间:2018-06-16 07:21:52

标签: c# winforms

我设计了一个内部有多个控件的用户控件。我将用户控件拖放到表单上,然后设置鼠标悬停事件,以便在某处显示注释。

但是有一个问题,用户应该将鼠标悬停在UserControl容器上以查看该注释,如果他将鼠标悬停在UserControl内的其中一个控件上,则不会发生任何事情。

如何在UserControl及其所有子节点上设置鼠标悬停(或其他事件)?

1 个答案:

答案 0 :(得分:2)

所有子控件都单独接收鼠标事件。作为一个选项,您可以为所有控件订阅所需的鼠标事件,并为您的用户控件引发所需的鼠标事件。

例如,在以下代码中,我已经引发了容器ClickDoubleClickMouseClickMouseDoubleClickMouseHover事件,当控件层次结构中的任何子项发生相应的事件时:

public UserControl1() {
    InitializeComponent();
    WireMouseEvents(this);
}
void WireMouseEvents(Control container) {
    foreach (Control c in container.Controls) {
        c.Click += (s, e) => OnClick(e);
        c.DoubleClick += (s, e) => OnDoubleClick(e);
        c.MouseHover += (s, e) => OnMouseHover(e);

        c.MouseClick += (s, e) => {
            var p = PointToThis((Control)s, e.Location);
            OnMouseClick(new MouseEventArgs(e.Button, e.Clicks, p.X, p.Y, e.Delta));
        };
        c.MouseDoubleClick += (s, e) => {
            var p = PointToThis((Control)s, e.Location);
            OnMouseDoubleClick(new MouseEventArgs(e.Button, e.Clicks, p.X, p.Y, e.Delta));
        };

        WireMouseEvents(c);
    };
}

Point PointToThis(Control c, Point p) {
    return PointToClient(c.PointToScreen(p));
}