0

現在、WPF キャンバスとスケーリングに苦労しています。特定のポイントを中心にキャンバスを拡大縮小できるようにしたい (特定のポイントは、拡大縮小後も同じ画面位置に留まる必要があります)。

スケーリングは単純なScaleTransformで行われます。Translation はPointオブジェクトに格納され、キャンバス内のすべての形状に適用されます。つまり、スケーリングが適用された後、すべての形状をオフセットする (移動ポイントを変更する) 必要があります。簡単にするために、ここでは単純化されたコード

class CanvasManager
{
    Point mTranslation; // holds the translation
    Canvas mCanvas;
    ScaleTransform mCanvasScale; // linked to mCanvas

    // Constructor omitted

    public void Scale(double factor, Point pt)
    {
        // retrieve the previous scaling factor
        double oldfactor = mCanvasScale.ScaleX;
        //apply the new factor
        mCanvasScale.ScaleX = factor;
        mCanvasScale.ScaleY = factor;
        // now offset so Point pt gets back at its original position
        mTranslation.X += ???;
        mTranslation.Y += ???;
    }
}

ポイントptは、キャンバスを基準にして測定されたマウス イベントから取得され、スケーリングが含まれます。(スケールが 2 の場合、相対スクリーン x 座標が 200 の場合、 ptの値として 400 が得られます)
変換 (スケール) は、次のコード スニペットで適用されます。

mCanvasScale = new ScaleTransform();
mCanvas.LayoutTransform = mCanvasScale;

mTranslation の正しいオフセットを取得するにはどうすればよいですか?

よろしく
デニス

4

1 に答える 1