2015-10-13 4 views
0

J'ai écrit un programme wpf C# qui traite des courbes sur un canevas. Donc je charge une courbe (une séquence de points dans un polylinesegment) et ensuite j'exécute diverses opérations dessus. Chaque courbe est mise sur l'écran par l'interaction de la souris et cela fonctionne bien. Chaque courbe vient ensuite avec un bloc de texte en son centre qui donne quelques informations. Donc, le problème vient quand je veux déplacer la forme de la souris. Je sélectionne d'abord la forme avec la souris (ça marche) et ensuite je la colle au curseur à travers l'événement OnMouseMove. Finalement, je l'ai mis sur le avec l'événement OnMouseLeftButtonDown. Donc, en bref, le OnMouseLeftButtonDown fonctionne toujours bien sauf quand je dois déplacer la forme ET l'étiquette. Dans ce cas, je dois appuyer plusieurs fois (au hasard) pour déclencher l'événement.OnLeftButtonDown tirant avec difficulté après avoir mis textblock avec canvas.set

J'ai alors recherché la partie qui cause le problème et c'est quand je déplace l'étiquette.

private void UpdateLabel(int index, PathInfo piToBeAdded) 
    { 
     plotCanvas.Children.Remove(names[index]); 

     TextBlock text = new TextBlock(); 
     text.TextAlignment = TextAlignment.Left; 
     text.FontSize = 12; 
     text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold }); 
     Canvas.SetLeft(text, piToBeAdded.Center.X);<-----those cause the problem 
     Canvas.SetTop(text, piToBeAdded.Center.Y);<------those cause the problem 
     text.ReleaseMouseCapture(); 
     names[index] = text;    
     plotCanvas.Children.Add(text); 
    } 

NB: pathinfo est juste une classe stockant des informations dont les coordonnées également Plus précisément, il est juste le Canvas.SetLeft et Canvas.SetTop qui provoque la OnMouseLeftButtonDown de ne pas tirer correctement. Je les enlève de l'étiquette va dans 0,0 et l'événement Mais quel est le problème avec ces instructions? Comment puis-je faire fonctionner le OnLeftButtonDownEvent correctement?

J'espère avoir décrit le problème correctement, j'ai essayé de mettre toutes les informations connexes.

Thanx à l'avance

Patrick

+0

Comment appellez-vous exactement cette méthode? De OnMouseLeftButtonDown lui-même? – toadflakz

+0

Cette méthode est appelée à partir de OnMouseMove qui traite du déplacement de la forme ET de l'étiquette qui suit le curseur. Ça marche. C'est quand je le mets avec le OnMouseLeftButtonDown que cet événement ne déclenche pas. – Patrick

Répondre

0

Toadflakz merci dans tous les cas je ne suis pas sûr si ma solution a à voir avec ce que vous suggérez. Au cas où je te donnerais le drapeau. J'ai remarqué que le problème est lié au fait que lorsque vous déplacez shape + textblock le point de la souris est EXACTEMENT au centre de la forme (je l'ai fait exprès) et donc EXACTEMENT sur le bloc de texte. Donc quand je clique je ne clique pas sur la toile mais sur l'étiquette. C'est pourquoi la toile ne tire pas. Je suppose que l'étiquette est en train de tirer.Bref, j'ai juste déplacé l'étiquette à quelques pixels et ça a fait l'affaire !!

+0

Vous pouvez également définir "IsHitTestVisible" de l'étiquette sur "false". En conséquence, l'étiquette n'attrape aucun mousclicks et votre code fonctionnera comme prévu ... –

+0

Très intelligent! Je ne le savais pas et ça marche! – Patrick

1

En général, il est préférable d'utiliser le que le bouton de la souris événement MouseButtonUp pour libérer la capture de la souris a certainement été libéré à ce moment-là et le mouvement est arrêté (ce qui est ce que vous capturent).

Votre problème avec Canvas.SetLeft est parce qu'il ne peut être fait appel à un enfant de l'objet Canvas et que vous ne fait qu'ajouter text à la collection Children après avoir appelé Canvas.SetLeft.

Edit:

En réponse à votre commentaire, le Canvas.SetLeft ne peut être fait appel à un enfant existant de la Canvas, alors appelez Add avant d'appeler Canvas.SetLeft.

private void UpdateLabel(int index, PathInfo piToBeAdded) 
{ 
    plotCanvas.Children.Remove(names[index]); 

    TextBlock text = new TextBlock(); 
    text.TextAlignment = TextAlignment.Left; 
    text.FontSize = 12; 
    text.Inlines.Add(new Run("(" + (GetPathsIndexFromId(piToBeAdded.ID) + 1) + ")ID:" + piToBeAdded.ID + " " + piToBeAdded.Name) { FontWeight = FontWeights.Bold }); 
    plotCanvas.Children.Add(text); // <---- moved this up 
    Canvas.SetLeft(text, piToBeAdded.Center.X); 
    Canvas.SetTop(text, piToBeAdded.Center.Y); 
    names[index] = text; 
} 

Sur la deuxième partie de votre commentaire, je suggère que vous attachez les gestionnaires aux différents éléments déplaçables et définir des indicateurs pour le « mode » de fonctionnement approprié que vous travaillez-à-dire les variables booléens pour ShapeDragInProgress et LabelDragInProgress . De cette façon, vous pouvez ensuite exécuter la procédure de capture de version correcte en fonction de l'événement ButtonUp.

+0

Ok, je vais déplacer le déblocage de la forme sur le bouton gauche, mais ça ne déclenche pas non plus. En ce qui concerne le problème, comment puis-je définir la position TextBlock sans le Canvas.SetXXX ?? J'ai plusieurs formes sur la toile et ça marche. Quand je mets l'étiquette avec ce Canvas.Set le problème se pose. Une solution de contournement? – Patrick