【发布时间】:2014-02-13 06:19:58
【问题描述】:
我正在 WPF 中编写一个小型绘图应用程序。我正在使用DrawingVisual 类在Canvas 上渲染形状。
我想为Canvas 控件实现放大/缩小。
1) 当我放大时,缩放焦点应该是鼠标位置。
2)当我缩小时,缩放焦点应该是Canvas的中心。
以下是我正在尝试但结果不令人满意的当前代码。
当我缩小时,所有形状都向缩放/缩放的中心位置移动,而不是向 Canvas 的实际中心位置移动。
所以请指导我如何计算偏移量 X 和 Y,以便形状向画布中心移动。
double zoomFactor = 1.1;
double offsetX = 0;
double offsetY = 0;
protected override void OnMouseWheel(MouseWheelEventArgs e)
{
double absoluteMouseX;
double absoluteMouseY;
double centerX = this.ActualWidth / 2; //Canvas center X
double centerY = this.ActualHeight / 2; // Canvas center Y
Point relativeMouseToCanvas = e.GetPosition(this);
if (e.Delta > 0)
{
absoluteMouseX = relativeMouseToCanvas.X * this.Zoom + offsetX;
absoluteMouseY = relativeMouseToCanvas.Y * this.Zoom + offsetY;
this.Zoom *= zoomFactor;
offsetX = absoluteMouseX - relativeMouseToCanvas.X * this.Zoom;
offsetY = absoluteMouseY - relativeMouseToCanvas.Y * this.Zoom;
}
if (e.Delta < 0)
{
absoluteMouseX = centerX * this.Zoom + offsetX;
absoluteMouseY = centerY * this.Zoom + offsetY;
this.Zoom /= zoomFactor;
offsetX = absoluteMouseX - centerX * this.Zoom;
offsetY = absoluteMouseY - centerY * this.Zoom;
}
// Refresh/Repaint shapes on canvas
}
【问题讨论】: