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考慮されますが、考慮されTransformToAncestorないためです。Canvas.LeftCanvas.Top

  • ZoomableCanvas には、外側のキャンバスに対するオフセットはありません。これは、ZoomableCanvas (ZoomableCanvasの子であるとCanvas.GetTop(touched)仮定) を基準とした上部オフセットを返すのに対して、外側の Canvas を基準にした上部オフセットを返すためです。touchedrelativePoint


最初の問題を説明するために、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 に答える