【问题标题】:Simulating a Drag/Drop event in WPF在 WPF 中模拟拖放事件
【发布时间】:2013-02-28 08:23:40
【问题描述】:

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

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

【问题讨论】:

    标签: wpf drag-and-drop


    【解决方案1】:

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

    这是我的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多