Панорамирование изображения дрожит при перемещении - PullRequest
0 голосов
/ 22 мая 2019

Следующий класс (PanImage) является адаптацией класса ZoomBorder из этой темы здесь Pan & Zoom Image .Поскольку мне нужно закрасить изображение, я не могу использовать рамку.Когда PanImage перемещается с помощью левой кнопки мыши, а кнопка все еще нажата, изображение перемещается назад и вперед между двумя положениями.Почему это происходит и как я могу исправить это поведение?

using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

class PanImage : Image
{

    public PanImage()
    {
        // add event-handler for changes of the SourceProperty of the Image class
        DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image));
        dpd?.AddValueChanged(this, delegate { Initialize(); });
    }


    private Point _origin;
    private Point _start;

    private TranslateTransform GetTranslateTransform()
    {
        return (TranslateTransform)((TransformGroup)RenderTransform)
          .Children.First(tr => tr is TranslateTransform);
    }

    private ScaleTransform GetScaleTransform()
    {
        return (ScaleTransform)((TransformGroup)RenderTransform)
          .Children.First(tr => tr is ScaleTransform);
    }

    public void Initialize()
    {
        RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);
        TransformGroup group = new TransformGroup();
        ScaleTransform st = new ScaleTransform();
        TranslateTransform tt = new TranslateTransform();
        group.Children.Add(st);
        group.Children.Add(tt);

        RenderTransform = group;
        RenderTransformOrigin = new Point(0.0, 0.0);

        MouseLeftButtonDown += handle_MouseLeftButtonDown;
        MouseLeftButtonUp += handle_MouseLeftButtonUp;
        MouseMove += handle_MouseMove;
        PreviewMouseRightButtonDown += handle_PreviewMouseRightButtonDown;
    }

    public void Reset()
    {
        // reset zoom
        var st = GetScaleTransform();
        st.ScaleX = 1.0;
        st.ScaleY = 1.0;

        // reset pan
        var tt = GetTranslateTransform();
        tt.X = 0.0;
        tt.Y = 0.0;
    }


    private void handle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var tt = GetTranslateTransform();
        _start = e.GetPosition(this);
        _origin = new Point(tt.X, tt.Y);
        Cursor = Cursors.Hand;
        CaptureMouse();
    }

    private void handle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        ReleaseMouseCapture();
        Cursor = Cursors.Arrow;
    }

    void handle_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        Reset();
    }

    private void handle_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseCaptured)
        {
            Vector v = _start - e.GetPosition(this);
            var tt = GetTranslateTransform();
            tt.X = _origin.X - v.X;
            tt.Y = _origin.Y - v.Y;
        }
    }
}

1 Ответ

0 голосов
/ 23 мая 2019

Проблема заключалась в получении координат мыши относительно элемента, который перемещается.Чтобы предотвратить это поведение, займите позицию от родительского элемента:

private void handle_MouseMove(object sender, MouseEventArgs e) {
    ...
    UIElement parentElem = VisualTreeHelper.GetParent(this) as UIElement;
    Vector v = _start - e.GetPosition(parentElem);
    ...
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...