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