Я пытаюсь перетащить элемент с помощью мыши, но он всегда начинает перетаскивать из определенного местоположения, а не из текущего местоположения. - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь перетащить прямоугольный элемент с именем «Rec» с помощью мыши.Я могу перетащить его в нужное место, и прямоугольник останется там, но когда я попытаюсь перетащить его снова, он вернется в первое место, и оттуда начнется перетаскивание.Я хочу перетащить его с того места, где я его оставил в прошлый раз.Я просто не понимаю, в чем проблема.

У меня есть только один холст, и все мои элементы находятся внутри него, холст называется "maincanvas".Я использую следующие очень простые события для перетаскивания.

Point originalPosition = new Point(0, 0);
    private void Rec_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
    {
        Point CurrPosition = Mouse.GetPosition(MainCanvas);
        Canvas.SetLeft(e.Source as UIElement,  -( originalPosition.X - CurrPosition.X));
        Canvas.SetTop(e.Source as UIElement,  -(originalPosition.Y - CurrPosition.Y));

    }


    private void Rec_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        UIElement a = e.Source as UIElement;
        a.CaptureMouse();
        Rec.MouseMove += Rec_MouseMove;
        originalPosition = Mouse.GetPosition(MainCanvas);


    }

    private void Rec_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        Rec.MouseMove -= Rec_MouseMove;
        UIElement a = e.Source as UIElement;
        a.ReleaseMouseCapture();
        originalPosition = new Point(0, 0);
    }

Я надеюсь, что вы, ребята, могли бы помочь мне.

1 Ответ

0 голосов
/ 05 июня 2018

Вы должны обрабатывать события мыши на Canvas следующим образом:

<Canvas MouseLeftButtonDown="CanvasMouseLeftButtonDown"
        MouseLeftButtonUp="CanvasMouseLeftButtonUp"
        MouseMove="CanvasMouseMove">
   ...
</Canvas>

В обработчике мыши вы получите элемент, который должен быть перетащен свойством MouseButtonEventArgs OriginalSource:

private UIElement draggedElement;
private Point lastMousePos;

private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.OriginalSource != sender)
    {
        IInputElement canvas = (IInputElement)sender;
        canvas.CaptureMouse();
        draggedElement = e.OriginalSource as UIElement;
        lastMousePos = e.GetPosition(canvas);
    }
}

private void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    ((IInputElement)sender).ReleaseMouseCapture();
    draggedElement = null;
}

private void CanvasMouseMove(object sender, MouseEventArgs e)
{
    if (draggedElement != null)
    {
        var p = e.GetPosition((IInputElement)sender);
        var dx = p.X - lastMousePos.X;
        var dy = p.Y - lastMousePos.Y;
        lastMousePos = p;

        Canvas.SetLeft(draggedElement, Canvas.GetLeft(draggedElement) + dx);
        Canvas.SetTop(draggedElement, Canvas.GetTop(draggedElement) + dy);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...