2013-02-28 86 views
3

我想模拟WPF中的拖放事件。
为此,我需要访问存储在“拖放缓冲区”中的数据,并且还需要创建一个DragEventArgs。 我注意到DragEventArgs是密封的,没有公共的ctor。模拟WPF中的拖放事件

所以我的问题是:
1.如何创建DragEventArgs的实例?
2.如何访问拖放缓冲区?

回答

0

我最近这样做!我使用MouseDown,MouseMove和MouseUp事件模拟拖放。例如我的应用程序,我有一些画布,我想要拖放它们。每个画布都有一个ID。在MouseDown事件中,我缓存它的id并在MouseMove和MouseUp事件中使用它。 Desktop_Canvas是我的主帆布,其中包含一些画布。这些油画是在我的字典(词典)。

这里是我的代码:

private Dictionary<int, Win> dic = new Dictionary<int, Win>(); 
    private Point downPoint_Drag = new Point(-1, -1); 
    private int id_Drag = -1; 
    private bool flag_Drag = false; 

    public class Win 
    { 
     public Canvas canvas = new Canvas(); 
     public Point downpoint = new Point(); 

     public Win() 
     { 
      canvas.Background = new SolidColorBrush(Colors.Gray); 
     } 
    } 

    private void Desktop_Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      Point movePoint = e.GetPosition(Desktop_Canvas); 

        if (flag_Drag && downPoint_Drag != new Point(-1, -1)) 
        { 
         double dy1 = movePoint.Y - downPoint_Drag.Y, x = -1, dx1 = movePoint.X - downPoint_Drag.X, y = -1; 
         downPoint_Drag = movePoint; 
         if (x == -1) 
          x = Canvas.GetLeft(dic[id_Drag].canvas) + dx1; 
         if (y == -1) 
          y = Canvas.GetTop(dic[id_Drag].canvas) + dy1; 
         Canvas.SetLeft(dic[id_Drag].canvas, x); 
         Canvas.SetTop(dic[id_Drag].canvas, y); 
        } 
     } 
     catch 
     { 
      MouseEventArgs ee = new MouseEventArgs((MouseDevice)e.Device, 10); 
      Desktop_Canvas_MouseLeave(null, ee); 
     } 
    } 

    private void Desktop_Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     try 
     { 
    downPoint_Drag = new Point(-1, -1); 
      id_Drag =-1; 
      flag_Drag = false; 
     } 
     catch 
     { 
      MouseEventArgs ee = new MouseEventArgs((MouseDevice)e.Device, 10); 
      Desktop_Canvas_MouseLeave(null, ee); 
     } 
    } 

    private void Desktop_Canvas_MouseLeave(object sender, MouseEventArgs e) 
    { 
     MouseButtonEventArgs ee = new MouseButtonEventArgs((MouseDevice)e.Device, 10, MouseButton.Left); 
      Desktop_Canvas_MouseLeftButtonUp(null, ee); 
    } 

    void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    {    
     downPoint_Drag = e.GetPosition(Desktop_Canvas); 
     int hoverId = HoverWin(downPoint_Drag); 
     flag_Drag = true; 
     id_Drag = hoverId; 
     dic[id_Drag].downpoint = new Point(downPoint_Drag.X, downPoint_Drag.Y); 
    } 

    private int HoverWin(Point p) 
    { 
     foreach (int i in dic.Keys) 
     { 
       if (dic[i].canvas.IsMouseOver) 
        return i; 
     } 
     return -1; 
    }