在鼠标位置放大并在画布中心缩小(不使用ScaleTransform)

时间:2014-02-13 06:19:59

标签: c# wpf canvas zoom

我正在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          
}

1 个答案:

答案 0 :(得分:1)

在您的情况下,缩小将翻译查看矩形的左上角。

enter image description here

该计划很清楚:    Δx= R1和R2之间的宽度差 所以Δx=(画布宽度)*缩放R2 - (画布宽度)*缩放R1

同样适用于Δy:
Δy=(画布高度)*缩放R2 - (画布高度)*缩放R1