我正在制作Windows窗体,但我无法按照我想要的方式使用鼠标悬停事件。我有50个小面板在一个大面板内组合在一起。我想在用户将鼠标悬停在一个小面板上时弹出信息。
我没有为每个小面板制作鼠标悬停事件,而是试图为大面板制作一个鼠标悬停事件。每当用户将鼠标悬停在大面板内的任何位置时,我的代码将确定它们是否悬停在一个小面板内,如果它们是,它将识别小面板并显示相关信息。
然而,我发现如果我将鼠标悬停在一个小面板上,那么大面板鼠标悬停事件不会触发,因为它在技术上处于小面板边界和大面板边界之外(有点像莱索托是如何自己的)即使它位于南非境内,也是如此。
有什么方法可以解决这个问题吗?
答案 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事件。