2010-11-20 8 views
1

J'ai des contrôles personnalisés dans mon Canvas.Faire la différence entre Sélectionner et Glisser dans WPF

Les contrôles peuvent être déplacés par glisser-déposer ou sélectionnés par un clic.

Maintenant, je mis en place le glisser-déposer quelque chose comme ceci:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     base.OnPreviewMouseLeftButtonDown(e); 
     this.isDragInProgress = false; 

     // Cache the mouse cursor location. 
     this.origCursorLocation = e.GetPosition(this); 

     // Walk up the visual tree from the element that was clicked, 
     // looking for an element that is a direct child of the Canvas. 
     var source = e.Source; 

     var element = this.FindCanvasChild(source as DependencyObject); 

     if (element == null || !(element is MyControl)) 
      return; 

     this.ElementBeingDragged = element; 

     // Get the element's offsets from the four sides of the Canvas. 
     this.draggedLeft = Canvas.GetLeft(this.ElementBeingDragged); 
     this.darggedTop = Canvas.GetTop(this.ElementBeingDragged); 

     // Set the Handled flag so that a control being dragged 
     // does not react to the mouse input. 
     e.Handled = true; 

     this.isDragInProgress = true; 
    } 

Maintenant, mon problème est que je ne peux pas sélectionner en cliquant MyControl sur elle ... (il n'y a pas de cas MouseClick sur la coutume Contrôle, ni MouseDown fonctionne maintenant ..)

Si je vais commenter e.Handled = true; le contrôle changera la sélection lorsque faites glisser, si ne le commentez pas, le contrôle ne changera pas la sélection du tout .... (

Répondre

5

Plutôt que de commencer l'opération glisser dans un M Gestionnaire ouseDown, vous pouvez enregistrer un état initial et vous engager à faire glisser dans un gestionnaire MouseMove, où vous pouvez comparer SystemParameters.MinimumHorizontalDragDistance et SystemParameters.MinimumVerticalDragDistance pour voir s'il y a eu suffisamment de mouvement pour commencer une opération de glisser. Vous pouvez ensuite inclure du code dans un gestionnaire MouseUp pour terminer l'opération de glissement ou, si elle n'a jamais démarré car le mouvement était trop petit, faites une sélection à la place.

0

Je viens d'écrire un article de projet de code qui pourrait vous aider. L'article concerne la sélection du glissement et le déplacement de plusieurs éléments.

Dans le gestionnaire d'événements MouseMove, il y a du code qui teste si l'utilisateur se déplace plus loin que la distance de seuil, lorsque cela se produit, l'opération de glissement est lancée.

http://www.codeproject.com/KB/WPF/SimpleDragSelection.aspx

Questions connexes