背景面板的C#鼠标悬停事件

时间:2016-02-09 23:10:59

标签: c# winforms visual-studio-2013 panel mousehover

我正在制作Windows窗体,但我无法按照我想要的方式使用鼠标悬停事件。我有50个小面板在一个大面板内组合在一起。我想在用户将鼠标悬停在一个小面板上时弹出信息。

我没有为每个小面板制作鼠标悬停事件,而是试图为大面板制作一个鼠标悬停事件。每当用户将鼠标悬停在大面板内的任何位置时,我的代码将确定它们是否悬停在一个小面板内,如果它们是,它将识别小面板并显示相关信息。

然而,我发现如果我将鼠标悬停在一个小面板上,那么大面板鼠标悬停事件不会触发,因为它在技术上处于小面板边界和大面板边界之外(有点像莱索托是如何自己的)即使它位于南非境内,也是如此。

有什么方法可以解决这个问题吗?

enter image description here

4 个答案:

答案 0 :(得分:2)

最干净的解决方案是实现您自己的LittlePanel控件:

public class LittlePanel : Panel
{
    public class HoverEventArgs
    {
        public bool Active { get; set; }

        public HoverEventArgs(bool active)
        {
            Active = active;
        }
    }

    public event EventHandler<HoverEventArgs> Hover;

    protected override void OnMouseEnter(EventArgs e)
    {
        base.OnMouseEnter(e);
        OnHover(true);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        OnHover(false);
    }

    protected void OnHover(bool active)
    {
        EventHandler<HoverEventArgs> hover = Hover;
        if (hover != null) hover(this, new HoverEventArgs(active));
    }
}

然后订阅&#34; big&#34;中所有Hover提出的LittlePanels个事件。 Panel

foreach (Control control in bigPanel.Controls)
{
    if (control is LittlePanel)
    {
        ((LittlePanel)control).Hover += littlePanel_Hover;
    }
}

使用共享事件处理程序:

void littlePanel_Hover(object sender, LittlePanel.HoverEventArgs e)
{
    // Your code goes here...
}

您还可以考虑向LittlePanel控件添加共享功能,例如包含标签,

答案 1 :(得分:1)

我最终选择了S. Brentson的建议。我在GridMouseHover文件中创建了自己的自定义事件处理程序Form.cs

    private void GridMouseHover(object sender, EventArgs e)
    {

    }

然后我在MouseHover事件期间将每个控件的GridMouseHover事件与我的新Form_Load事件相关联,以便在MouseHover事件之前将它们全部关联起来可能会触发。

    private void Form4_Load(object sender, EventArgs e)
    {
        this.panel1.MouseHover += GridMouseHover;
        this.panel2.MouseHover += GridMouseHover;
        this.panel3.MouseHover += GridMouseHover;
        //etc...
    }

我已经在我的Form.cs[Design]窗口手动创建了我的所有面板,这就是为什么我没有尝试TaW的建议,但我一定会尝试下次,因为手工制作一切都非常繁琐。谢谢你的帮助!

答案 2 :(得分:1)

在您的单个活动中尝试此操作,例如希望这会对您有所帮助

private void Panaal_MouseMove(object sender, MouseEventArgs e)
{
   Control ctr = sender as Control;
   if (ctr.Name.Equals("Panel Name"))
    {
     //your POP Up code
    }
}

答案 3 :(得分:0)

如果要使顶部控件对鼠标事件透明,可以使用以下代码:

protected override void WndProc(ref Message m)
{
    const int WM_NCHITTEST = 0x0084;
    const int HTTRANSPARENT = -1;

    switch(m.Msg)
    {
        case WM_NCHITTEST:
            m.Result = (IntPtr)HTTRANSPARENT;
            break;
        default:
            base.WndProc(ref m);
    }
}

例如,您有一个图像,并且图像后面有一个可以将鼠标移到上方的按钮,该按钮将执行MouseHover事件。