WPF Canvas 以鼠标指针为中心缩放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
XMAL:
 
<Canvas
    x:Name="mCanvas"
    MouseWheel="mCanvas_MouseWheel"
    Background="Wheat"
>
<Canvas.RenderTransform>
    <TransformGroup>
        <ScaleTransform x:Name="mScaleTf" ScaleX="1.0" CenterX="0"></ScaleTransform>       
        <TranslateTransform x:Name="mTranslateTf" X="10" Y="20"></TranslateTransform>
    </TransformGroup>
</Canvas.RenderTransform>
</Canvas>
 
------------------------------------------------------------------------------------------------------
 
Code:
 
private void mCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
 
           Point zoomCenter = e.GetPosition(this.mCanvas);//参数必须是this.mCanvas, e.GetPosition和RenderTransform有关?
 
            //或者:
            //Point screenPos = e.GetPosition(this);
            //Point zoomCenter = this.mCanvas.RenderTransform.Inverse.Transform(screenPos);
 
            Point pt = this.mCanvas.RenderTransform.Inverse.Transform(zoomCenter);
            this.mTranslateTf.X = (zoomCenter.X - pt.X) * this.mScaleTf.ScaleX ;
            this.mTranslateTf.Y = (zoomCenter.Y - pt.Y) * this.mScaleTf.ScaleY;
            this.mScaleTf.CenterX = zoomCenter.X;
            this.mScaleTf.CenterY = zoomCenter.Y;
            this.mScaleTf.ScaleX += e.Delta / 1000.0;
            this.mScaleTf.ScaleY += e.Delta / 1000.0;
 
            Console.WriteLine("MouseWheel : " + zoomCenter.ToString());
 
}
 
或者
 
private void mCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
    Point mousePos = e.GetPosition(this);
 
    //oldCenter : untransformed and transformed
    Point untransformedOldCenter = new Point(this.mScaleTf.CenterX, this.mScaleTf.CenterY);
    Point transformedOldCenter = this.mScaleTf.Transform(untransformedOldCenter);
 
    //newCenter : untransformed and transformed
    Point untransformedNewCenter = this.mCanvas.RenderTransform.Inverse.Transform(mousePos);
    Point transformedNewCenter = mousePos;
 
    double adjustX = transformedNewCenter.X - transformedOldCenter.X - untransformedNewCenter.X + untransformedOldCenter.X;
 
    //update transforms
    this.mTranslateTf.X = adjustX;
    this.mScaleTf.CenterX = untransformedNewCenter.X;
    this.mScaleTf.ScaleX += 0.1;
}

  

posted @   多见多闻  阅读(773)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示