![](/img/trans.png)
[英]C# Winforms - How can I have user controls (with children) hosted in a datagridview respond to mouse events?
[英]Detect mouse over User Control and all children - C# WinForms
我設計了一個內部帶有多個控件的用戶控件。 我將用戶控件拖放到窗體上,然后設置鼠標懸停事件以在某處顯示注釋。
但是有一個問題,用戶應該將鼠標懸停在UserControl容器上才能看到該注釋。如果他將鼠標懸停在UserControl內部的某個控件上,則什么也不會發生。
如何設置鼠標懸停(或其他事件)在UserControl及其所有子控件上引發?
所有子控件分別接收鼠標事件。 作為一種選擇,您可以為所有控件預訂所需的鼠標事件,並為用戶控件引發所需的鼠標事件。
例如,在下面的代碼中,我提出的容器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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.