c# - How to drag RenderTransform with mouse in WPF? -
i want make viewer move , zoom children mouse. so, create class transformviewer : usercontrol
, override event methods. have problem onmousemove. when translate rendertransform, onmousemove called continuously, if don't move mouse. , rendertransform shakes.
protected override void onmousemove(mouseeventargs e) { point mouse = e.getposition( ); vector delta = point.subtract( mouse, oldmouse ); oldmouse = mouse; if(keyboard.iskeydown( key.leftshift ) && (e.leftbutton == mousebuttonstate.pressed || e.rightbutton == mousebuttonstate.pressed)) { matrix matrix = transform.matrix; matrix.translate( delta.x, delta.y ); transform.matrix = matrix; e.handled = true; rendertransform = transform; } }
why so?
better change rendertransform of child.
public class transformviewer : usercontrol { private readonly matrixtransform transform = new matrixtransform(); private point pressedmouse; protected override void onmousedown(mousebuttoneventargs e) { pressedmouse = transform.inverse.transform( e.getposition( ) ); } protected override void onmousemove(mouseeventargs e) { if(e.middlebutton == mousebuttonstate.pressed) { point mouse = transform.inverse.transform( e.getposition( ) ); vector delta = point.subtract( mouse, pressedmouse ); // delta old mouse current mouse var translate = new translatetransform( delta.x, delta.y ); transform.matrix = translate.value * transform.matrix; ((uielement) content).rendertransform = transform; e.handled = true; } } protected override void onmousewheel(mousewheeleventargs e) { float scale = 1.1f; if(e.delta < 0) scale = 1f / scale; point mouse = e.getposition( ); matrix matrix = transform.matrix; matrix.scaleat( scale, scale, mouse.x, mouse.y ); transform.matrix = matrix; ((uielement) content).rendertransform = transform; e.handled = true; } }
Comments
Post a Comment