C#WPF – 拖动图像

我试图获得一些简单的function,从文件中获取图像,将其添加到Canvas,然后允许用户左键单击(并保持)图像,然后将其拖动到Canvas(即更新图像的地点)

这是我到目前为止,我应该添加什么?

private void btnAddImage_Click(object sender, RoutedEventArgs e) { try { System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog(); open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK) { PictureBox PictureBox1 = new PictureBox(); PictureBox1.Image = new Bitmap(open.FileName); myCanvas.children.add(PictureBox1); } } catch (Exception) { throw new ApplicationException("Failed loading image"); } } 

您可以将“ 图像”控件添加到“canvas”,并在鼠标输入上修改其“ Left和“ Top属性。

XAML:

         

代码背后:

 private void AddButtonClick(object sender, RoutedEventArgs e) { var dialog = new Microsoft.Win32.OpenFileDialog(); dialog.Filter = "Image Files (*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp"; if ((bool)dialog.ShowDialog()) { var bitmap = new BitmapImage(new Uri(dialog.FileName)); var image = new Image { Source = bitmap }; Canvas.SetLeft(image, 0); Canvas.SetTop(image, 0); canvas.Children.Add(image); } } private Image draggedImage; private Point mousePosition; private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var image = e.Source as Image; if (image != null && canvas.CaptureMouse()) { mousePosition = e.GetPosition(canvas); draggedImage = image; Panel.SetZIndex(draggedImage, 1); // in case of multiple images } } private void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (draggedImage != null) { canvas.ReleaseMouseCapture(); Panel.SetZIndex(draggedImage, 0); draggedImage = null; } } private void CanvasMouseMove(object sender, MouseEventArgs e) { if (draggedImage != null) { var position = e.GetPosition(canvas); var offset = position - mousePosition; mousePosition = position; Canvas.SetLeft(draggedImage, Canvas.GetLeft(draggedImage) + offset.X); Canvas.SetTop(draggedImage, Canvas.GetTop(draggedImage) + offset.Y); } } 

您需要在代码中添加拖放支持,方法是在您使用的WPF控件中处理拖放路由事件。

如果您使用的是.NET 4.0及更高版本(Visual Studio 2010及更高版本),请参阅此WPDN拖放概述的 MSDN库。

但请注意拖放的数据类型。