C# Mouse Hover Event для фоновой панели

Я делаю форму Windows, и у меня возникают проблемы с тем, чтобы событие Mouse Hover работало так, как я хочу. У меня есть 50 маленьких панелей, сгруппированных внутри одной большой панели. Я хочу, чтобы информация всплывала всякий раз, когда пользователь наводит курсор на маленькую панель.

Вместо того, чтобы делать событие наведения мыши для каждой маленькой панели, я пытаюсь сделать только одно событие наведения мыши для большой панели. Всякий раз, когда пользователь наводит указатель мыши где-либо внутри большой панели, мой код будет определять, находятся ли они внутри маленькой панели, и если это так, он идентифицирует маленькую панель и отображает соответствующую информацию.

Тем не менее, я обнаружил, что событие при наведении мыши на большую панель не срабатывает, если я наведите курсор мыши на небольшую панель, поскольку она технически находится за границами маленькой панели и за пределами границ большой панели (вроде как Лесото является его собственной страной, хотя это в пределах границ Южной Африки).

Есть ли какой-то способ обойти это?

3 ответа

Самым чистым решением было бы реализовать свой собственный 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));
    }
}

Тогда подпишитесь на 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 контроль, такой как содержащиеся ярлыки и т. д.

Я закончил тем, что согласился с тем, что предложил С. Брентсон. Я сделал свой собственный обработчик событий под названием 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, но я обязательно попробую это в следующий раз, так как делать все вручную было очень утомительно. Спасибо за помощь!

Попробуйте это на вашем отдельном мероприятии, например, надеюсь, это поможет вам

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

Если вы хотите сделать верхний элемент управления прозрачным для событий мыши, вы можете использовать этот код:

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.

Другие вопросы по тегам