2009-03-22 5 views
0

J'ai un userControl (.NET 1.1 Winforms) qui a une imagebox cliquable comme bouton. Comme j'ai beaucoup de ces commandes usb visibles en même temps, j'ai pensé que ça pourrait être sympa si j'affiche simplement la boîte d'image quand la souris est sur la commande userc et la cache autrement. Pour ce faire, je gère les événements MouseEnter et MouseLeave de UserControl, masquant et affichant la zone d'image. Cela fonctionne bien.Le comportement étrange de MouseLeave de .NET UserControl

Mais lorsque la zone de texte cliquable est visible, je ne suis plus en mesure de cliquer dessus (le curseur de la main est parti et l'événement de clic ne se déclenche pas). Après un test, je me rends compte que si je commente tout le contenu du gestionnaire MouseLeave qui fait quelque chose avec ma picturebox ... de cette façon, la zone d'image est cliquable.

Je n'utilise pas l'événement correct?

Il existe une autre façon d'accomplir cela?

Voici le code ...

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 

Le gestionnaire d'événements problématique:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave 
    Me.pictAdd.Visible = False 
End Sub 

Mise à jour: Si je redimensionnez la picturebox sur MouseLeave (juste pour faire quelque chose) cela fonctionne. Jusqu'ici, en changeant Visible et Lieu dans le MouseLeave m'empêche de cliquer sur la zone d'image. : S

Répondre

7

Lorsque la souris se déplace sur votre bouton, quelque chose de semblable à ce qui suit se produit:

  1. La souris quitte le usercontrol (même si elle est encore à l'intérieur du contrôle) et entre dans la picturebox
    • feux de gestionnaire d'événements MouseLeave, rendant le picturebox pas visible
  2. Parce que le picturebox n'est pas visible, la souris quitte le picturebox et entre dans la usercontrol
    • Feux de gestionnaire d'événements MouseEnter, rendant le picturebox visible
  3. Parce que le picturebox est maintenant visible, le processus recommence depuis le début

Quand je teste votre code, le bouton » "clignotait continuellement (car sa visibilité était toujours inversée) et ne pouvait pas rester visible assez longtemps pour enregistrer des clics.

Une façon d'aborder est de modifier votre gestionnaire MouseLeaves être quelque chose comme ceci:

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 

Ce contrôle pour vous assurer que la souris a effectivement quitté le contrôle avant de faire disparaître le bouton.

La modification de la taille de la zone d'image peut avoir brisé le cycle décrit ci-dessus, mais elle ne résout pas le problème fondamental.

Voici quelques autres (qui ont rien à voir avec votre question) à considérer:

  • Je pense qu'il est recommandé que vous remplacez juste le OnMouseLeaves, méthodes etc dans votre usercontrol, au lieu de souscrire à les événements correspondants. Rappelez-vous que manipuler les commandes de cette façon peut empêcher quelqu'un d'utiliser votre application uniquement avec un clavier. (L'utilisateur ne peut pas Tab à votre bouton et appuyez sur Entrée )
+0

Je soupçonnait que quelque chose comme ça où se passe, alors je fais la logique à l'intérieur d'une minuterie Hidding ... démarrer le chronomètre lorsque la souris part et l'arrête après avoir caché le bouton. Maintenant, je peux me débarrasser de la minuterie ... Merci beaucoup. – Romias