簡體   English   中英

在用戶控件和所有子控件上檢測鼠標-C#WinForms

[英]Detect mouse over User Control and all children - C# WinForms

我設計了一個內部帶有多個控件的用戶控件。 我將用戶控件拖放到窗體上,然后設置鼠標懸停事件以在某處顯示注釋。

但是有一個問題,用戶應該將鼠標懸停在UserControl容器上才能看到該注釋。如果他將鼠標懸停在UserControl內部的某個控件上,則什么也不會發生。

如何設置鼠標懸停(或其他事件)在UserControl及其所有子控件上引發?

所有子控件分別接收鼠標事件。 作為一種選擇,您可以為所有控件預訂所需的鼠標事件,並為用戶控件引發所需的鼠標事件。

例如,在下面的代碼中,我提出的容器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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM