我目前正在努力使用WPF画布和缩放。我希望能够围绕特定点缩放画布(缩放后给定点应保持在同一屏幕位置)。
使用简单的 ScaleTransform 完成缩放。翻译存储在 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,我得到400作为 pt 的值) Transform(Scale)应用以下代码片段:
mCanvasScale = new ScaleTransform();
mCanvas.LayoutTransform = mCanvasScale;
如何获得mTranslation的正确偏移量?
最好的问候 丹尼斯
答案 0 :(得分:1)
解决方案应该是
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;
}
}