我正在WPF中编写一个小型绘图应用程序。我使用DrawingVisual
类在Canvas
上呈现形状。
我想为Canvas
控件实现放大/缩小。
1)当我放大时,变焦焦点应该是鼠标位置。
2)当我缩小时,变焦焦点应该是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
}
答案 0 :(得分:1)
在您的情况下,缩小将翻译查看矩形的左上角。
该计划很清楚: Δx= R1和R2之间的宽度差 所以Δx=(画布宽度)*缩放R2 - (画布宽度)*缩放R1
同样适用于Δy:
Δy=(画布高度)*缩放R2 - (画布高度)*缩放R1