2010-01-08 16 views
0

J'ai un bon modèle (je pense!) Pour permettre à un utilisateur de faire glisser un élément dans une pile et de le repositionner à un autre emplacement dans le panneau de pile.(VB.NET + WPF) Glisser + déposer (pour permettre le tri des utilisateurs) des éléments de la pile dans un Scrollviewer?

Cependant, mon StackPanel est placé dans un ScrollViewer, comme celui-ci (généralisé):

<ScrollViewer> 
    <StackPanel> 
     ....First item 
     ....Second item 
     ....Third item 
     ....Etc. 
    </StackPanel> 
<ScrollViewer> 

est ici le problème, je souhaite simuler la fonctionnalité des programmes comme Word, où si je traînais contenu sélectionné (ou un objet) en dehors de la zone visible, la fenêtre défilera dans la direction de la souris pour voir plus d'endroits pour déposer mon petit objet astucieux.

... c.-à-d. Si je déplace la souris vers le haut de mon ScrollViewer tout en faisant glisser le contenu d'une pile, je veux que le scrollviewer se déplace lentement vers le haut pour que je puisse voir plus d'endroits où déposer mon contenu.

Des suggestions?

Si vous pouvez m'aider à résoudre cela, vous serez une aubaine!

Répondre

0

Aucun problème. Gérez l'événement routé DragOver au niveau ScrollViewer. Obtenez la position. S'il est proche du haut des limites de ScrollViewer, faites défiler vers le haut. S'il est proche du bas des limites de ScrollViewer, faites défiler vers le bas.

Le défilement lui-même est fait en appelant scrollViewer.LineUp() ou scrollViewer.LineDown(). Les événements DragOver viennent fréquemment, alors enregistrez la valeur DateTime.Now dans un champ chaque fois que vous appelez LineUp() ou LineDown(). Avant de les appeler à nouveau, vérifiez DateTime.Now et si le temps s'est écoulé, n'appelez pas LineUp() ou LineDown().

Pour un meilleur contrôle de la vitesse de défilement, vous pouvez utiliser scrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset + delta) au lieu de scrollViewer.LineUp() et scrollViewer.LineDown().

Vous pouvez offrir une meilleure expérience utilisateur si vous permettez un défilement plus rapide lorsque vous vous trouvez plus près du haut ou du bas du visualiseur de défilement. Cela peut être fait en divisant la zone de défilement en zones ou en calculant la vitesse à partir de la position de la souris. Dans ce cas, les modifications de vitesse peuvent être effectuées en appelant LineUp()/LineDown() plusieurs fois lorsque vous vous rapprochez du bord ou en augmentant la valeur delta si vous utilisez ScrollToVerticalOffset. Vous ne devriez probablement pas modifier le timing (comparaison DateTime.Now) à cette fin, car il ne sera pas fiable.

+0

Génial, je vais essayer ça demain. Moving est un mindbender, bien que ça se passe vraiment ensemble. Merci! –