简体   繁体   English

如何在WPF中用鼠标拖动RenderTransform?

[英]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 : UserControlTransformViewer : 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM