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.