0

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

我是不是用错了。它不是映射到父视觉并给出一个相对点吗?

4

1 回答 1

1

您要比较的值只有在以下情况下才会相等

  • 上没有设置转换(RenderTranform 或 LayoutTransform) touched,因为在 or 属性中考虑了这些,TransformToAncestor但不在Canvas.LeftorCanvas.Top属性中。

  • ZoomableCanvas 相对于外部画布没有偏移。这是因为Canvas.GetTop(touched)返回相对于 ZoomableCanvas 的顶部偏移量(假设它touched是 ZoomableCanvas 的子级),而relativePoint相对于外部 Canvas。


为了说明第一个问题,只需将带有 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 和top100。

于 2013-01-19T16:18:39.090 回答