首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在鼠标位置放大,在画布中心缩小(不使用ScaleTransform)

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

Stack Overflow用户
提问于 2014-02-13 06:19:59
回答 1查看 2.9K关注 0票数 0

我正在写一个WPF的小绘图应用程序。我使用DrawingVisual类在Canvas上渲染形状。

我想实现Canvas控件的放大/缩小。

1)当我放大时,缩放焦点应该是鼠标的位置。

2)当我缩小时,缩放焦点应该是Canvas的中心。

下面是我正在尝试的当前代码,但结果并不令人满意。

当我缩小时,所有形状都朝缩放后的中心位置移动,而不是向画布的实际中心位置移动。

因此,请指导我应该如何计算偏移X和Y,以便形状将移动到画布的中心。

代码语言:javascript
运行
AI代码解释
复制
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          
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-13 12:55:53

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

这项计划清楚显示:

代码语言:javascript
运行
AI代码解释
复制
∆x = the difference of width between R1 and R2.

所以缩放x=(画布宽度)*缩放R2 -(画布宽度)*缩放R1

∆y也是如此:

∆y =(画布高度)*缩放R2 -(画布高度)*缩放R1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21746681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文