【问题标题】:how to drag & drop image from wrap panel to canvas如何将图像从包装面板拖放到画布
【发布时间】:2014-07-22 07:11:09
【问题描述】:

我正在使用 Visual Studio 2012 编写 C# WPF 应用程序。

我从数据库中获取了一些图像并将它们放入包装面板中。从包装面板中,我想将图像拖放到画布中。这就是我从数据库中获取图像的方式:

private void GetImages(int taskID, int activityID)
{
   IList<ModelSQL.TwoCategory> ImagesList = twocat.GetImageURL(taskid, type);

   foreach (ModelSQL.TwoCategory tc in ImagesList)
   {
      var uriSource = new Uri(root.SetupInformation.ApplicationBase + tc.Pictures);
      Image img = new Image();
      img.Source = new BitmapImage(uriSource);
      img.VerticalAlignment = VerticalAlignment.Center;
      img.HorizontalAlignment = HorizontalAlignment.Center;
      img.Stretch = Stretch.Uniform;
      img.Height = 100;
      img.Width = 100;
      img.AllowDrop = true;
      img.PreviewMouseDown += new MouseButtonEventHandler(img_MouseDown);
      img.PreviewMouseMove += new MouseEventHandler(img_MouseMove);
      img.PreviewGiveFeedback += new GiveFeedbackEventHandler(img_GiveFeedback);
      img.PreviewMouseUp += new MouseButtonEventHandler(img_PreviewMouseUp);
      Canvas1.AllowDrop = true;
      Canvas2.AllowDrop = true;

      //Canvas1.PreviewDrop += new DragEventHandler(Canvas1_PreviewDrop);
      //Canvas2.PreviewDrop += new DragEventHandler(Canvas2_PreviewDrop);

      imgPanel.Children.Add(img);    
   }   
}

我使用了拖动装饰器来拖动图像,效果很好。

private void img_MouseDown(object sender, MouseButtonEventArgs e)
{
   startPoint = e.GetPosition(this);
}

private void img_MouseMove(object sender, MouseEventArgs e)
{
   // int y = 0, z = 0;
   if (e.LeftButton == MouseButtonState.Pressed)
   {
      var source = sender as UIElement;
      Image img = sender as Image;

      //img.Background = System.Windows.Media.Brushes.YellowGreen;
      Point current = e.GetPosition(this);
      Vector diff = startPoint - current;

      if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
          Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
      {    
         adorner = new DragAdorner(img, e.GetPosition(img));
         AdornerLayer.GetAdornerLayer(img).Add(adorner);

         var dragData = new DataObject(this);

         //string str = img.Content.ToString();    

         //DragDrop.DoDragDrop(lbl, lbl.Content, DragDropEffects.Move | DragDropEffects.Copy);
         DragDrop.DoDragDrop(img, dragData, DragDropEffects.Move | DragDropEffects.Copy);
         AdornerLayer.GetAdornerLayer(img).Remove(adorner);    
      }    
   }
}

private void img_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{ }

private void img_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
   if (adorner != null)
   {
      Image img = sender as Image;

      var pos = img.PointFromScreen(GetMousePosition());
      adorner.UpdatePosition(pos);
      e.Handled = true;
   }

}

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);

[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
   public Int32 X;
   public Int32 Y;
};

public static Point GetMousePosition()
{
   Win32Point w32Mouse = new Win32Point();
   GetCursorPos(ref w32Mouse);
   return new Point(w32Mouse.X, w32Mouse.Y);
}

但我无法将图像拖放到画布中,我可以将图像拖到应用程序中的任何位置。如何禁用它?

This 是图形用户界面

这是掉落事件

private void Canvas1_Drop(object sender, DragEventArgs e)
        {
            ImageSource imageSource = e.Data.GetData(typeof(ImageSource)) as ImageSource;
            Image img = sender as Image;
            img.Source = imageSource;
            Canvas Canvas1 = sender as Canvas;
            Canvas1.Children.Add(img);

        }

【问题讨论】:

    标签: c# wpf canvas drag-and-drop wrappanel


    【解决方案1】:

     DragDrop.DoDragDrop(img, dragData, DragDropEffects.Move | DragDropEffects.Copy);
    

    您管理,数据已被提供给拖放操作。

    现在,每个其他控件,例如画布,可以在他们的 DragOver 和 Drop 事件中决定他们是否想要/可以对数据做任何事情。 数据的来源或多或少是游戏之外的,当拖放开始时,剩下的就是放置目标。 如果您不希望您的数据离开源代码管理,您应该附加到它的 DragLeave 事件并在鼠标移开时取消拖放操作。

    【讨论】:

    • private void Canvas1_Drop(object sender, DragEventArgs e) { ImageSource imageSource = e.Data.GetData(typeof(ImageSource)) as ImageSource;图片 img = 作为图片的发件人; img.Source = imageSource; Canvas Canvas1 = 作为 Canvas 的发件人; Canvas1.Children.Add(img); }
    • 看不出问题出在哪里,建议在你的Canvas1_Drop-method中下一个断点,逐行调试看看,哪个部分不起作用。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多