简体   繁体   中英

Relative position with TransformToAncestor

I have a canvas (ZoomableCanvas) which implements zooming and has child items. I'm trying to get the relative position of a child item when zooming in, in order to display extended information over it.

<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 behind:

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

But here canvasTop != relativePoint.Y before zooming?

Am I using this incorrectly. Doesn't it map to the parent visual and give a relative point?

The values you're comparing will only be equal if

  • There is no transform (RenderTranform or LayoutTransform) set on touched , since these are taken into account in TransformToAncestor but not in the Canvas.Left or Canvas.Top properties.

  • The ZoomableCanvas has no offset relative to the outer canvas. This is because Canvas.GetTop(touched) returns the top offset relative to the ZoomableCanvas (assumed that touched is a child of the ZoomableCanvas), whereas relativePoint is relative to the outer Canvas.


To illustrate the first issue, just put an element with a RenderTransform into a Canvas:

<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>

If you'd call

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

it would return point as (100, 200), whereas left is 50 and top is 100.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM