我有一个Panel控件的mouseenter和mouseleave事件,当鼠标进入时更改背景颜色,当鼠标离开时返回白色。
我还在这个面板中添加了一个Label控件,但当鼠标进入Label控件时,会触发Panel的mouseleave事件。
这很合理,但我该如何在鼠标停留在Panel区域内时保持Panel的背景颜色不变,而不受其中其他控件的影响呢?
private void panel1_MouseLeave(object sender, EventArgs e)
{
if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null)
{
panel1.BackColor = Color.Gray;
}
}
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;
}
}
为包含的控件添加事件意味着当您想要将另一个控件添加到面板时,您也必须进行相同的操作。
为父控件添加事件意味着一旦您想在其他地方使用面板,您必须为新的父控件做同样的事情。当面板的要求发生变化时,您必须记住将处理从父控件的事件中移除。
这些都可能会在稍后变得有点混乱。
我倾向于在面板的鼠标离开事件中放置一些坐标检查,并且仅当鼠标真正超出面板的边界时才重置面板颜色。
这样,您处理面板的代码仅适用于相关的面板。
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; };
}
}