问题描述
我在WPF中(C#)Canvas中画了N多条线段、圆、文字。现在我想用鼠标滚轮以鼠标指针为缩放点同时缩放Canvas中的所有图形,鼠标左键按下能同时平移所有图形。改怎么做,我写出来的缩放是以左上角为原点的,平移时会跳动。当Canvas大小改变时整个Canvas里的图形会等比例的放大缩小。1、缩放时Canvas大小不得改变,只是缩放图形2、能同时支持鼠标和平板触屏操作平移缩放。3、给源代码最好。谢谢各位老师
解决方案
解决方案二:
每一个图形控件,它只要修改一下缩放参数Scale就能自动化地缩放,这完全是你滚轮事件来决定的。因此控件自身的大小缩放本身并不用考虑鼠标位置问题。在你整体缩放地图的时候,可以捕获鼠标中心点。那么对于地图上任何一点(比如说你的任何图形控件的左上角的坐标),可以算出它与中心点在x、y坐标上的直线距离,然后缩放这个偏移距离。例如中心点在(100,100),那么一个点(98,99)距离中心点的偏移就是(-2,-1),如果缩放系数为2,就是要偏移(-4,-2),也就是挪动到(96,98)这个新位置上。
解决方案三:
关于“平移时会跳动”的问题,不知道你是怎样实现的。在平移时就是简单地修改一下控件的X、Y属性就行了,而且在你平移开始之前可以禁止WPF刷新界面,等平移完所有控件之后再允许刷新,应该没有任何跳动。
解决方案四:
privatevoidsf(objectsender,MouseWheelEventArgse)//图形缩放{Pointcen=e.GetPosition(hb);sfk.CenterX=cen.X;sfk.CenterY=cen.Y;if(sfk.ScaleX<0.3&&sfk.ScaleY<0.3&&e.Delta<0){return;}sfk.ScaleX+=(double)e.Delta/1000.0;sfk.ScaleY+=(double)e.Delta/1000.0;}privatevoidhb_MouseMove(objectsender,MouseEventArgse)//平移{if(e.LeftButton==MouseButtonState.Pressed){foreach(UIElementsinhb.Children){PointpCanvas=e.GetPosition(hb);Canvas.SetLeft(s,pCanvas.X-targetPoint.X);Canvas.SetTop(s,pCanvas.Y-targetPoint.Y);}}}
解决方案五:
引用2楼sp1234的回复:
关于“平移时会跳动”的问题,不知道你是怎样实现的。在平移时就是简单地修改一下控件的X、Y属性就行了,而且在你平移开始之前可以禁止WPF刷新界面,等平移完所有控件之后再允许刷新,应该没有任何跳动。
privatevoidsf(objectsender,MouseWheelEventArgse)//图形缩放{Pointcen=e.GetPosition(hb);sfk.CenterX=cen.X;sfk.CenterY=cen.Y;if(sfk.ScaleX<0.3&&sfk.ScaleY<0.3&&e.Delta<0){return;}sfk.ScaleX+=(double)e.Delta/1000.0;sfk.ScaleY+=(double)e.Delta/1000.0;}privatevoidhb_MouseMove(objectsender,MouseEventArgse)//平移{if(e.LeftButton==MouseButtonState.Pressed){foreach(UIElementsinhb.Children){PointpCanvas=e.GetPosition(hb);Canvas.SetLeft(s,pCanvas.X-targetPoint.X);Canvas.SetTop(s,pCanvas.Y-targetPoint.Y);}}}