我有一个Panel控件的mouseenter和mouseleave事件,它在鼠标进入时更改背景色,并在离开时返回到白色。C#窗体中的自定义控件Windows窗体鼠标事件问题
我在此面板中也有Label控件,但是当鼠标进入Label控件时,面板的mouseleave事件会触发。
这是有道理的,但是如果鼠标在其区域内时没有其他控件影响它,该如何保持面板的背景颜色相同?
我有一个Panel控件的mouseenter和mouseleave事件,它在鼠标进入时更改背景色,并在离开时返回到白色。C#窗体中的自定义控件Windows窗体鼠标事件问题
我在此面板中也有Label控件,但是当鼠标进入Label控件时,面板的mouseleave事件会触发。
这是有道理的,但是如果鼠标在其区域内时没有其他控件影响它,该如何保持面板的背景颜色相同?
您可以使用GetChildAtPoint()来确定鼠标是否在子控件上。
private void panel1_MouseLeave(object sender, EventArgs e)
{
if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null)
{
panel1.BackColor = Color.Gray;
}
}
如果控制实际上不是一个子控件,您仍然可以使用MousePosition和PointToScreen以确定是否鼠标仍然在控制的范围之内。
private void panel1_MouseLeave(object sender, EventArgs e)
{
Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size);
if (!screenBounds.Contains(MousePosition))
{
panel1.BackColor = Color.Gray;
}
}
您可以为标签添加一个MouseEnter事件,该事件还可以设置面板的背景颜色。您不需要标签的MouseLeave事件。
或者:
如果你想要做点2以上而不触及父控件的代码(根据其他用户的评论),你可以做这样的事情在小组ParentChanged事件:
private void panel1_ParentChanged(object sender, EventArgs e)
{
Panel thisPanel = sender as Panel;
if(thisPanel != null && thisPanel.Parent != null)
{
thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; };
}
}
为包含的控件添加事件意味着,当您想要将另一个控件添加到面板时,您也必须通过相同的练习。
为父控件添加一个事件意味着只要您希望在其他地方使用该面板,就必须对新父项执行相同的操作。当面板的需求发生变化时,您必须记住将处理从父控件的事件中移出。
所有潜在的麻烦进一步下行。
我倾向于在面板的鼠标离开事件中放置一些坐标检查,并且只有在鼠标已经超出面板边界时才重置面板颜色。
这样,面板处理的代码只保留在有问题的面板上。
我找到了一个简单的解决方案。我只是将标签上的enabled属性设置为false,并没有问题。
...它会没事,直到你想在你的面板上启用控制:) – ChrisA 2008-12-07 15:01:03