与TransformToAncestor的相对位置

时间:2013-01-19 15:45:11

标签: c# wpf

我有一个画布(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在放大之前?

我是否错误地使用了这个。它是否映射到父视觉并给出相对点?

1 个答案:

答案 0 :(得分:1)

如果

,您所比较的值将相等
  • 没有设置变换(RenderTranform或LayoutTransform) touched,因为在TransformToAncestor中考虑了这些因素 不在Canvas.LeftCanvas.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。