comportamiento extraño MouseLeave de control de usuario .NET
-
21-08-2019 - |
Pregunta
Tengo un control de usuario (NET 1.1 Windows Forms) que tiene un cuadro de imagen puede hacer clic como un botón.
Desde que tengo un montón de esos controles de usuario visibles al mismo tiempo, pensé que podría ser bueno si simplemente mostrar el cuadro de imagen cuando el ratón está sobre el control de usuario y esconderlo lo contrario.
Para hacerlo, controlar los eventos MouseEnter y MouseLeave del control de usuario, ocultar y mostrar el cuadro de imagen. Eso funciona bien.
Sin embargo, cuando el cuadro de imagen puede hacer clic es visible ya que no soy capaz de hacer clic en él (el cursor de mano se ha ido y el evento click no está disparando).
Después de algunas pruebas, me doy cuenta de que si todo el contenido de comentario el manejador MouseLeave que hacer algo con mi cuadro de imagen ... de esta manera el cuadro de imagen se puede hacer clic.
No estoy usando el evento correcto?
Hay otra manera de lograr esto?
Aquí está el código ...
Private Sub NodoEstablo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.pictAdd.Visible = False
End Sub
Private Sub NodoEstablo_MouseEnters(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
Me.pictAdd.Visible = True
End Sub
El controlador de eventos problemáticos:
Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
Me.pictAdd.Visible = False
End Sub
Actualización: Si puedo cambiar el tamaño del cuadro de imagen en MouseLeave (sólo para hacer algo) que funciona. Hasta ahora, el cambio visible y ubicación en el MouseLeave me impiden por haga clic en el cuadro de imagen. : S
Solución
Cuando se mueve el ratón sobre el botón, algo similar a lo ocurre lo siguiente:
- El ratón sale del usercontrol (a pesar de que todavía está dentro del control) y entra en el cuadro de imagen
- Sus
MouseLeave
incendios de controlador de eventos, por lo que el cuadro de imagen no visible
- Sus
- Debido a que el cuadro de imagen no es visible, el ratón sale del cuadro de imagen y entra en el usercontrol
- Sus
MouseEnter
incendios de controlador de eventos, por lo que el cuadro de imagen visible
- Sus
- Debido a que el cuadro de imagen es ahora visible, el proceso comienza de nuevo desde el principio
Cuando probé el código, el "botón" parpadeaba continuamente (ya que mantenía con su visibilidad alternar) y era incapaz de permanecer visible el tiempo suficiente para registrar los clics.
Una manera de abordar esto es para modificar su MouseLeaves
manejador a ser algo como esto:
Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.MouseLeave
If Not ClientRectangle.Contains(PointToClient(Cursor.Position)) Then
Me.pictAdd.Visible = False
EndIf
End Sub
Esto comprueba para asegurarse de que el ratón en realidad haya dejado el control antes de hacer desaparecer el botón.
Cambiar el tamaño del cuadro de imagen puede haber roto el ciclo ha indicado anteriormente, pero no aborda el problema fundamental.
Aquí están algunas otras cosas (que no tienen nada que ver con su pregunta) a tener en cuenta:
- Creo que es recomendable que usted acaba de anular el
OnMouseLeaves
, métodos, etc en su control de usuario, en lugar de suscribirse a los eventos correspondientes. - Recuerde que el manejo de los controles de esta manera puede hacer que sea imposible que alguien pueda utilizar la aplicación, con sólo un teclado. (Es decir, el usuario no puede Tab a su botón y presione Intro )