Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将偏移应用于缩放以保留特定点_C#_Wpf_Canvas_Scaling - Fatal编程技术网

C# 将偏移应用于缩放以保留特定点

C# 将偏移应用于缩放以保留特定点,c#,wpf,canvas,scaling,C#,Wpf,Canvas,Scaling,我目前正在努力与WPF画布和缩放。我希望能够围绕特定点缩放画布(缩放后给定点应保持在相同的屏幕位置) 使用简单的ScaleTransform进行缩放。翻译存储在点对象中,并应用于画布中的所有形状。这意味着在应用缩放后,我必须偏移所有形状(修改平移点)。为了简单起见,这里有一个简化的代码 class CanvasManager { Point mTranslation; // holds the translation Canvas mCanvas; ScaleTransf

我目前正在努力与WPF画布和缩放。我希望能够围绕特定点缩放画布(缩放后给定点应保持在相同的屏幕位置)

使用简单的ScaleTransform进行缩放。翻译存储在对象中,并应用于画布中的所有形状。这意味着在应用缩放后,我必须偏移所有形状(修改平移点)。为了简单起见,这里有一个简化的代码

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时,我得到400作为pt)的值
转换(缩放)应用于以下代码段:

mCanvasScale = new ScaleTransform();
mCanvas.LayoutTransform = mCanvasScale;
如何获得MTTranslation的正确偏移量

致以最诚挚的问候
丹尼斯解决方案应该是

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 -= ( (pt.X * factor) - (pt.X * oldfactor) ) / factor;
        mTranslation.Y -= ( (pt.Y * factor) - (pt.Y * oldfactor) ) / factor;
    }
}

只需设置ScaleTransform的
CenterX
CenterY
属性,您就可以围绕特定点进行缩放。@Clemens我尝试过,但似乎对缩放没有影响。在创建和调整大小事件中,我有类似于mCanvasScale.CenterX=mCanvas.Width/2的内容;“你如何将转换应用到画布上?”克莱门斯编辑了原稿。我使用的是LayoutTransform属性try RenderTransform。LayoutTransform忽略任何翻译。