2013-04-11 2 views
2

J'ai un contrôle appelé RackViewer qui contient un autre contrôle appelé ItemViewer. Le contrôle RackViewer est ajouté dynamiquement à un autre contrôle parent. Dans le contrôle parent, je souhaite créer un événement de glisser-déposer de sorte que lorsque l'utilisateur ferait glisser un élément sur le contrôle ItemViewer dans RackViewer, l'événement se déclencherait. Actuellement, je le fais comme ceci:Conversion des problèmes de coordonnées de l'écran en client

private void RackView_DragEnter(object sender, DragEventArgs e) 
{ 
    RackViewer rackView = (RackViewer)sender; 
    if (rackView.IsMouseOnItemViewer(rackView.PointToClient(new Point(e.X, e.Y)))) 
    { 
     //content goes here 
    } 
} 

private void RackView_DragDrop(object sender, DragEventArgs e) 
{ 
    RackViewer rackView = (RackViewer)sender; 
    if(rackView.IsMouseOnItemViewer(rackView.PointToClient(new Point(e.X, e.Y)))) 
    { 
     //content goes here 
    } 
} 

private void listbox_MouseDown(object sender, MouseEventArgs e) 
{ 
    ListBox dragDropSender = (ListBox)sender; 
    int index = dragDropSender.IndexFromPoint(new Point(e.X, e.Y)); 
    if (index >= 0) 
    { 
     dragDropSender.SelectedIndex = index; 
     dragDropSender.DoDragDrop(dragDropSender.SelectedItem, DragDropEffects.Move); 
    } 
} 

Notez la méthode IsMouseOnItemViewer. Cette méthode est contenue dans la classe rackViewer et confirme que l'utilisateur fait glisser l'élément sur ItemViewer avant de procéder à la séquence d'événements de déplacement. La raison pour laquelle je fais ceci est parce que je n'ai pas accès au ItemViewer du contrôle parent de RackViewer puisque c'est 2 contrôles plus haut dans la hiérarchie. La méthode « IsMouseOnItemViewer » ressemble à ceci:

public ItemViewer View { get {return itemViewer; } } 

/// <param name="mousePoint"> The coordinates of the mouse in client coordinates. </param> 
    /// <returns> True if the user is hovering over the ItemViewer control and false otherwise.</returns> 
    public bool IsMouseOnItemViewer(Point mousePoint) 
    { 
     if (View.Bounds.Contains(mousePoint)) 
      return true; 
     else 
      return false; 
    } 

Cependant, pour une raison quelconque cet événement retourne jamais vrai! Peu importe où je glisserais la souris sur le contrôle RackViewer, il semble ne jamais détecter qu'il est sur le ItemViewer. Qu'est-ce que je fais mal?

+0

avez-vous essayé de déboguer ou de tracer le 'mousePoint' et' View.Bounds' pour voir qu'ils sont vraiment ce que vous attendez? View.Bounds sont des coordonnées relatives au parent de ItemViewer. Etes-vous sûr que 'mousePoint' est également relatif au parent de ItemViewer? est parent parent rackView de l'instance ItemViewer? –

+0

Oui, le contrôle parent ItemViewer est RackViewer en tant que positionné directement sur le RackViewer dans le concepteur. Je suppose que faire rackViewer.PointToClient (nouveau Point (e.X, e.Y)) aurait converti le point de la souris à partir des coordonnées de l'écran à des coordonnées par rapport à RackViewer? J'ai un peu de mal à déboguer puisque le DragEnter se lance même à droite quand j'entre dans le RackViewer et donc je n'aurais bien sûr pas encore les bonnes coordonnées. – user1410668

+0

oui, il aurait dû. Je voudrais enregistrer les coordonnées et vérifier les valeurs. –

Répondre

0

Ok, j'ai trouvé l'erreur. Mon problème était que l'événement dragEnter ne se déclenche qu'une seule fois et qu'il se déclenche dès que la souris fait glisser l'objet sur le rackviewer. Ainsi, la souris n'aura jamais le temps d'atteindre réellement ItemViewer. Merci de votre aide. Je vais devoir utiliser quelque chose de plus dynamique que DragEnter.

Questions connexes