2013-01-19 3 views
0

J'ai une toile (ZoomableCanvas) qui implémente le zoom et a des éléments enfants. J'essaie d'obtenir la position relative d'un élément enfant lors d'un zoom avant, afin d'afficher des informations étendues sur celui-ci.Position relative avec TransformToAncestor

<Canvas x:Name="CanvasContainer" Width="1500" Height="780"> 
    <ZoomableCanvas ApplyTransform="false" Loaded="ZoomableCanvas_Loaded" x:Name="ShareCanvas" Width="1500" Height="780" MinWidth="1500" MinHeight="780" Grid.Row="0" Grid.Column="0" /> 
</Canvas> 

code derrière:

Canvas main = touched.FindVisualParent<Canvas>(); //Finds "CanvasContainer" 
Point relativePoint = touched.TransformToAncestor(main).Transform(new Point(0, 0)); 
double canvasTop = Canvas.GetTop(touched); 

Mais ici canvasTop = relativePoint.Y avant le zoom? Est-ce que je l'utilise incorrectement? Ne correspond-il pas au visuel parent et donne-t-il un point relatif?

+1

Pourquoi les 'Grid.Row' et' Grid.Column' sur le ZoomableCanvas? – Clemens

+0

Restes d'un changement. Merci d'avoir signalé ce peu de négligence. –

Répondre

1

Les valeurs que vous comparez ne sera égal si

  • Il est transform pas (ou RenderTranform LayoutTransform) situé sur touched, puisque ceux-ci sont pris en compte dans TransformToAncestor mais pas dans le Canvas.Left ou Canvas.Top propriétés.

  • ZoomableCanvas n'a aucun décalage par rapport à la zone de travail externe. Ceci est parce que Canvas.GetTop(touched) retourne au début décalé par rapport à la ZoomableCanvas (supposé que touched est un enfant du ZoomableCanvas), tandis que relativePoint est externe par rapport à la toile .


Pour illustrer la première question, il suffit de mettre un élément avec un RenderTransform en toile:

<Canvas x:Name="canvas"> 
    <Label x:Name="child" Content="Hello" Canvas.Left="50" Canvas.Top="100"> 
     <Label.RenderTransform> 
      <TranslateTransform X="50" Y="100"/> 
     </Label.RenderTransform> 
    </Label> 
</Canvas> 

Si vous appelez

var point = child.TransformToAncestor(canvas).Transform(new Point()); 
var left = Canvas.GetLeft(child); 
var top = Canvas.GetTop(child); 

il retournerait point comme (100, 200), alors que left est 50 et top est 100.

+0

Merci Clemens, je comprends à cause de votre explication. Je ne fais pas de transformation sur les objets enfants. Je les ajoute cependant dans le code. Je suspecte que ceci peut être le problème car j'obtiens 0,0 pour un point relatif. –

+0

Et (0,0) serait parfaitement ok sauf si vous n'avez pas défini Canvas.Left ou Canvas.Top. – Clemens

+0

Pensez que je l'ai trouvé, je nettoyais tous les enfants et les ré-ajouter pour réinitialiser. Si je ne fais pas cela, cela fonctionne correctement selon votre excellente explication. –