首页 > 代码库 > 拖拽控件

拖拽控件

拖拽控件

1.背景

Diagram Designed这类项目,往往需要用到拖拽功能,以便将各类元素拖放到画布中。本文将总结一种在用WPF实现拖拽功能的方法。

2.拖拽逻辑

         拖动对象简单的说来包含两个过程:<1>拖、<2>放。当然,如果需要细分的话,可以包括:<1>选中、<2>拖、<3>放,但前两个动作是一气呵成的,所以简单起见,两个过程就够了。

         拖动过程的主要参与者包括被拖动目标与被放置目标

         对于拖动作,在WPF中对应被拖动目标的MouseMove事件(同时需要判断MouseButtonState.Pressed)。

         对于放动作,在WPF中对应被放置目标的Drop事件。

3.拖拽过程的对象传递

   3.1 DragDrop管理类
          在拖拽过程中有一个重要的中间过程类(个人觉得它的作用有点类似于ASP.Net中的Session)DragDrop管理类。
          3.1.1对象存入
       调用DragDrop管理类的DoDragDrop (),就可以实现将被拖拽对象,存入DragDrop管理类。用法如下:

var dragData = http://www.mamicode.com/new DataObject("myShape", type);

                DragDrop.DoDragDrop(sender as Shape, dragData, DragDropEffects.Move);
          3.1.1对象取出
    取出对象则直接使用Drop对象的参数DragEventArgs e,用法如下:
                var type = (ShapeType)e.Data.GetData("myShape");

         有了DragDrop管理类,整个拖拽过程的传递就简单了。为了看起来像是把元素拖到画板上,首先在MouseMove中将被拖动对象的特征信息(或者是其本身)存入到DragDrop管理类中。当Drop事件触发时,从DragDrop管理类中再获取存入的信息,并还原被拖动对象(或其代表的对象)。接下来可以选择生成新的被拖动对象或其他的逻辑。

 

拖拽控件