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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!