visual net eventos evento doble derecho crear c# winforms events

net - Controles personalizados en C#Pregunta del evento del mouse de Windows Forms



eventos del mouse en c# (4)

Tengo un evento mouseenter y mouseleave para un control Panel que cambia el color de fondo cuando el mouse entra y vuelve a ser blanco cuando se va.

También tengo el control Label en este panel, pero cuando el mouse ingresa el control Label, el evento mouseleave para el panel se dispara.

Esto tiene sentido, pero ¿cómo puedo mantener igual el color de fondo del Panel cuando el mouse está en su área sin que los otros controles internos lo afecten?


Agregar un evento para un control contenido significa que cuando desea agregar otro control al panel, también debe realizar el mismo ejercicio.

Agregar un evento para el control principal significa que tan pronto como desee usar el panel en otro lugar, debe hacer lo mismo con el nuevo padre. Y cuando cambian los requisitos para el panel, debe recordar sacar el procesamiento del evento del control principal.

Todo potencialmente desordenado un poco más adelante.

Me inclinaría a realizar algunas comprobaciones de coordenadas en el evento de abandono del mouse para el panel y solo restablecer el color del panel si el mouse realmente se ha salido de los límites del panel.

De esta forma, su código para el manejo del panel permanece solo en el panel en cuestión.


Puede agregar un evento MouseEnter para la etiqueta que también establece el color de fondo del Panel. No necesitaría un evento MouseLeave para la etiqueta.

O:

  1. Establezca el evento MouseEnter para que el Panel establezca el color de fondo del Panel.
  2. Establezca el evento MouseEnter del control principal del Panel (por ejemplo, el Formulario) para restablecer el color de fondo del Panel.

Si quisiera hacer el punto 2 anterior sin tocar el código del control principal (según el comentario de otro usuario), podría hacer algo como esto en el evento ParentChanged del Panel:

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; }; } }


Puede usar GetChildAtPoint () para determinar si el mouse está sobre un control secundario.

private void panel1_MouseLeave(object sender, EventArgs e) { if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null) { panel1.BackColor = Color.Gray; } }

Si el control no es realmente un control secundario, aún puede usar MousePosition y PointToScreen para determinar si el mouse está todavía dentro de los límites del control.

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; } }


Encontré una solución simple. Acabo de establecer la propiedad enabled en false en la etiqueta y está bien.