我有一个画布(ZoomableCanvas),它实现缩放并具有子项。我试图在放大时获取子项的相对位置,以便在其上显示扩展信息。
<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>
代码背后:
Canvas main = touched.FindVisualParent<Canvas>(); //Finds "CanvasContainer"
Point relativePoint = touched.TransformToAncestor(main).Transform(new Point(0, 0));
double canvasTop = Canvas.GetTop(touched);
但是这里的canvasTop!= relativePoint.Y在放大之前?
我是否错误地使用了这个。它是否映射到父视觉并给出相对点?
答案 0 :(得分:1)
如果
,您所比较的值将相等没有设置变换(RenderTranform或LayoutTransform)
touched
,因为在TransformToAncestor
中考虑了这些因素
不在Canvas.Left
或Canvas.Top
属性中。
ZoomableCanvas相对于外部画布没有偏移量。这个
是因为Canvas.GetTop(touched)
返回相对的顶部偏移量
到ZoomableCanvas(假设touched
是孩子的
ZoomableCanvas),而relativePoint
是相对于外部的
画布。
为了说明第一个问题,只需将带有RenderTransform的元素放入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>
如果你打电话
var point = child.TransformToAncestor(canvas).Transform(new Point());
var left = Canvas.GetLeft(child);
var top = Canvas.GetTop(child);
它会将point
返回为(100,200),而left
为50且top
为100。