我设计了一个内部有多个控件的用户控件。我将用户控件拖放到表单上,然后设置鼠标悬停事件,以便在某处显示注释。
但是有一个问题,用户应该将鼠标悬停在UserControl容器上以查看该注释,如果他将鼠标悬停在UserControl内的其中一个控件上,则不会发生任何事情。
如何在UserControl及其所有子节点上设置鼠标悬停(或其他事件)?
答案 0 :(得分:2)
所有子控件都单独接收鼠标事件。作为一个选项,您可以为所有控件订阅所需的鼠标事件,并为您的用户控件引发所需的鼠标事件。
例如,在以下代码中,我已经引发了容器Click
,DoubleClick
,MouseClick
,MouseDoubleClick
和MouseHover
事件,当控件层次结构中的任何子项发生相应的事件时:
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));
}