我正在尝试使用鼠标拖动和元素,但它总是从特定位置而不是当前位置开始拖动

  • 本文关键字:拖动 位置 开始 定位 元素 鼠标 c# wpf xaml
  • 更新时间 :
  • 英文 :


我正在尝试使用鼠标拖动一个名为"Rec"的矩形元素。我可以将其拖动到我想要的位置,矩形将保留在那里,但是当我尝试再次拖动它时,它会返回到第一个位置,并且从那里开始拖动。我想从上次离开的地方拖动它。我只是不明白问题出在哪里。

我只有一个画布,我所有的元素都在里面,画布被称为"主画布"。我使用以下非常简单的事件进行拖动。

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);
}

我希望你们能帮助我。

您应该像这样处理画布上的鼠标事件:

<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);
}
}

最新更新