[英]How to drag RenderTransform with mouse in WPF?
I want to make a viewer which will move and zoom children with mouse. 我想制作一个可以用鼠标移动和缩放儿童的查看器。 So, I create the class
TransformViewer : UserControl
and override an event methods. 因此,我创建了
TransformViewer : UserControl
类TransformViewer : UserControl
并重写了一个事件方法。 But I have a problem with OnMouseMove. 但是我对OnMouseMove有问题。 When I translate RenderTransform, OnMouseMove is called continuously, even if I don't move mouse.
翻译RenderTransform时,即使不移动鼠标,也会连续调用OnMouseMove。 And RenderTransform shakes.
和RenderTransform震动。
protected override void OnMouseMove(MouseEventArgs e) {
Point mouse = e.GetPosition( this );
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 to change RenderTransform of a child. 最好更改孩子的RenderTransform。
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( this ) );
}
protected override void OnMouseMove(MouseEventArgs e) {
if(e.MiddleButton == MouseButtonState.Pressed) {
Point mouse = transform.Inverse.Transform( e.GetPosition( this ) );
Vector delta = Point.Subtract( mouse, pressedMouse ); // delta from old mouse to 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( this );
Matrix matrix = transform.Matrix;
matrix.ScaleAt( scale, scale, mouse.X, mouse.Y );
transform.Matrix = matrix;
((UIElement) Content).RenderTransform = transform;
e.Handled = true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.