J'utilise le gestionnaire d'événements ManipulationDelta
pour faire glisser et déposer une simple ellipse dans un canevas à l'écran. J'utilise l'approche standard publiée en ligne à plusieurs endroits. Voici le code dans mon gestionnaire d'événements:Délai de glisser/déposer de UIElement dans Windows Phone 8.1
Ellipse dragableItem = sender as Ellipse;
TranslateTransform translateTransform = dragableItem.RenderTransform as TranslateTransform;
double newPosX = Canvas.GetLeft(dragableItem) + translateTransform.X + e.Delta.Translation.X;
double newPosY = Canvas.GetTop(dragableItem) + translateTransform.Y + e.Delta.Translation.Y;
if (!isCanvasBoundary(newPosX, TestCanvas.ActualWidth - dragableItem.ActualWidth, 0))
translateTransform.X += e.Delta.Translation.X;
if (!isCanvasBoundary(newPosY, TestCanvas.ActualHeight - dragableItem.ActualHeight, 0))
translateTransform.Y += e.Delta.Translation.Y;
La traînée et opération fonctionne baisse très bien, mais il y a un retard méchant d'environ 1 seconde entre le moment où l'utilisateur commence à glisser quand l'ellipse change réellement sa position. Je peux voir en imprimant au débogueur que le gestionnaire d'événements lui-même termine l'exécution presque instantanément, donc je devine qu'il a quelque chose à faire un taux de rafraîchissement pré-programmé pour tous les UIElements sur l'écran qui cause ce retard?
Y a-t-il une solution à ce problème?
Merci beaucoup! Un petit problème avec cela était que la dernière ellipse déplacée changerait de position même lorsque l'utilisateur tape sur une partie de la toile où l'ellipse n'est pas située. Pour remédier à cela, j'ai ajouté un événement 'PointerReleased' et une simple variable bool qui est définie sur true dans' PointerPressed' et de nouveau sur false dans 'PointerReleased'. Puis, dans 'PointerMoved', je vérifiais le booléen et je ne bougeais l'ellipse que si c'était vrai. En outre, j'ai trouvé qu'imprimer quelque chose dans le débogueur à partir de l'événement 'PointerMoved' introduit un retard substantiel. – Ali250
@ Ali250 Un moyen plus facile que j'ai trouvé était de définir 'draggedItem = null;' dans l'événement PointerReleased plutôt que de mettre en place une nouvelle variable booléenne –
excellente solution alternative +1. – hushyon