Хорошо, несколько вещей здесь не так ...
1) Ваш обработчик мыши должен быть на изображении, а не на холсте, иначе ваш код не сможет узнать, какой элемент перетаскивается.
2) После нажатия на изображение обработчик должен захватить мышь для холста, чтобы получить все сообщения о перемещении мыши.
3) Затем необходимо обработчики Canvas MouseMove и MouseUpбыть обработанным соответственно.
4) У Холста должен быть фон.Если вы не предоставите ему фон, то он будет фактически прозрачным для тестирования на попадание, и вы не получите сообщения мыши для него.Если вы не хотите, чтобы у него был видимый фон, установите для него значение Transparent
.
Таким образом, ваш тег Canvas должен выглядеть следующим образом:
<Canvas x:Name="canvasImages" Height="325" Margin="0,0,0,0" Width="430"
HorizontalAlignment="Left" VerticalAlignment="Top" AllowDrop="True"
PreviewMouseLeftButtonUp="CanvasImages_PreviewMouseLeftButtonUp"
PreviewMouseMove="CanvasImages_PreviewMouseMove"
MaxWidth="430" MaxHeight="325"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
Background="Transparent" />
И каждое создаваемое вами изображениедля этого события MouseDown должен быть установлен обработчик:
img.MouseLeftButtonDown += Img_MouseLeftButtonDown;
Тогда нужно просто реализовать свои обработчики следующим образом:
private void Img_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.draggedItem = (UIElement)sender;
itemRelativePosition = e.GetPosition(this.draggedItem);
e.Handled = true;
}
private void CanvasImages_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (this.draggedItem == null)
return;
var newPos = e.GetPosition(canvasImages) - itemRelativePosition;
Canvas.SetTop(this.draggedItem, newPos.Y);
Canvas.SetLeft(this.draggedItem, newPos.X);
canvasImages.CaptureMouse();
e.Handled = true;
}
private void CanvasImages_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (this.draggedItem != null)
{
this.draggedItem = null;
canvasImages.ReleaseMouseCapture();
e.Handled = true;
}
}