C#Windows窗体鼠标事件问题中的自定义控件

我有一个用于Panel控件的mouseenter和mouseleave事件,当鼠标进入时会改变背景颜色,当它离开时会返回白色。

我也在此面板中有Label控件,但当鼠标进入Label控件时,面板的mouseleave事件将触发。

这是有道理的,但是当鼠标位于其区域而其他控件不会影响它时,如何保持Panel的背景颜色相同?

您可以使用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; } } 

为包含的控件添加事件意味着当您想要向面板添加另一个控件时,您也必须执行相同的练习。

为父控件添加事件意味着只要您想在其他位置使用面板,就必须为新父控件执行相同的操作。 当面板的要求发生变化时,您必须记住将处理从父控件的事件中取出。

所有潜在的混乱都在线下。

我倾向于在面板的鼠标离开事件中进行一些坐标检查,并且只有在鼠标真的超出面板边界时才重置面板颜色。

这样,您的面板处理代码仅保留在相关面板上。

我找到了一个简单的解决方 我只是在标签上将enabled属性设置为false,这很好。

您可以为标签添加MouseEnter事件,该事件也设置Panel的背面颜色。 您不需要标签的MouseLeave事件。

要么:

  1. 为Panel设置MouseEnter事件以设置Panel的背景颜色。
  2. 设置Panel的父控件(例如Form)MouseEnter事件以重置Panel的背面颜色。

如果您想在不触及父控件代码的情况下执行上述第2点(根据其他用户的注释),您可以在Panel的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; }; } }