【问题标题】:Zoom In at mouse location and Zoom out at center of Canvas (Not using ScaleTransform)在鼠标位置放大并在画布中心缩小(不使用 ScaleTransform)
【发布时间】: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          
}

【问题讨论】:

    标签: c# wpf canvas zooming


    【解决方案1】:

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

    方案很清楚:
    Δx = R1 和 R2 之间的宽度差。
    所以 ∆x = (画布宽度) * R2 的缩放 - (画布宽度) * R1 的缩放

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

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 2018-03-07
      • 2019-04-07
      • 2018-11-14
      • 2014-08-18
      • 2014-04-16
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      相关资源
      最近更新 更多