美文网首页
C#中实现控件拖拽效果(How to DragDrop Cont

C#中实现控件拖拽效果(How to DragDrop Cont

作者: BarretX | 来源:发表于2017-10-31 20:50 被阅读0次

当产品间需要交互实现数据传递,或产品需要从外部导入文件时,通过控件拖拽来实现是个不错的选择。在UI上支持控件拖拽,可极大提升用户体验。
拖拽本身并不神秘,它的本质实际是一个数据交换的过程。控件接受从其他地方来的数据,并进行处理。数据交换有多种方法,Windows中剪贴板可能就是用的最多,但最不被注意的一种方法。
下面介绍用C#实现控件拖拽,并通过剪切板交换数据。

控件拖拽触发/响应函数

对于拖拽的对象,需要在MouseDownItemDrag中调用DoDragDrop,传递要拖拽的数据对象并触发拖拽。总的来说,当用户调用DoDragDrop方法后,就进入到一个循环中。 循环会一直跟踪鼠标,检查鼠标所在的窗体是否实现IDropTarget,如果实现了则:调用DropEnter,并通过调用GiveFeedBack来显示效果;鼠标在控件上时,调用DropOver,也是通过GiveFeedBack来显示效果;在拖拽过程中,键盘或鼠标按键发生变化,可以通过QueryContinueDrag来检查是否能继续操作,根据不同的返回结果,调用DropOverDropLeave;鼠标释放时触发DragDrop事件,执行拖拽逻辑。

  • DragEnter、DragOver、DragLeave事件
    触发: 当用鼠标拖拽一个对象到控件的窗口时,首先触发DragEnter,然后是DragOver,拖放对象悬浮于拖放区域,在拖放区域内移动时多次触发DragOver,当离开窗体时触发DragLeave。
    作用: 设置判断对象是否是要接受的类型以及鼠标的样式。
  • DragDrop事件
    触发: 当用户拖拽对象到控件上,并释放时触发。
    作用: 接受拖拽数据,实现拖拽逻辑

实现控件拖拽的典型流程

  1. 设置AllowDrop
    在对一个控件进行拖拽编程时,我们必须把AllowDrop属性设置为True
  2. 拖动对象触发DragDrop
private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    this.listBox1.DoDragDrop("Drag Data", DragDropEffects.Move);
}
  1. 拖到目标响应DragDrop
private void listBox2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Text))
    {
        //设置DragDrop效果
        e.Effect = DragDropEffects.Move;
    }
}

private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
    //执行DragDrop逻辑
    this.listBox2.Items.Add(e.Data.GetData(DataFormats.Text));
    this.listBox1.Items.Remove(e.Data.GetData(DataFormats.Text));
}

控件拖拽的参数

public DragDropEffects DoDragDrop ( Object data,DragDropEffects allowedEffects)
  • data:户所要拖动的数据内容。必须将所要拖动的内容传入到这个方法的第一个参数位置。并不是必须得,比如在不同应用间传递数据时,可以借由剪切板

控件拖拽的特效

控件拖拽的特效由DragDropEffects枚举来指定。

  • DragDropEffects说明
成员名称 说明
All Copy、Move 和 Scroll 效果的组合
Copy 将拖动源中的数据复制到放置目标,图标为一个框右上角带+
Link 将拖动源中的数据链接到放置目标,图标为数据快捷图标
Move 将拖动源的数据移动到放置目标,图标为一个框
None 放置目标不接受该数据,图标为禁止标识
Scroll 拖动时,如果有滚动条目,可以滚动目标,以定位在目标中当前不可见的某个放置位置

[Demo]

  • 界面
  • 功能
    实现文件的拖拽以及应用程序之间的拖拽。

相关文章

  • C#中实现控件拖拽效果(How to DragDrop Cont

    当产品间需要交互实现数据传递,或产品需要从外部导入文件时,通过控件拖拽来实现是个不错的选择。在UI上支持控件拖拽,...

  • Android自定义View(7)利用贝塞尔曲线仿QQ消息拖拽气

    先看看最终效果: 这个自定义控件可以实现与绑定控件解耦,无论是什么控件,只要一行代码绑定即可实现拖拽的效果,并且可...

  • 拖拽API

    实现拖拽效果 目前实现拖拽效果 HTML5拖拽 源元素事件例子 目标元素事件 从本地拖放图片到页面中 实现拖拽

  • SwipeLayout解析-动画篇

    前言 本文将通过对github的开源控件SwipeLayout的分析,来学习其拖拽效果的实现原理,以及对View中...

  • 模仿即刻安卓APP的DragToFinishPhotoView实

    效果预览 实现思路 本控件主要基于PhotoView来实现,放大、拖拽以及和ViewPager的冲突处理都是借鉴P...

  • 实现可拖拽的RecycleView

    效果图 其实实现这种效果有两种方法: 1.View.startDrag(), 然后给需要监听拖拽的控件setOnD...

  • HTML5实现拖拽

    实现拖拽效果源元素 - 要拖拽的文件目标元素 - 要拖拽到哪里去 目前实现拖拽效果使用原生DOM就能实现 - 最麻...

  • Android拖拽详解

    其实实现这种效果有两种方法: View.startDrag(), 然后给需要监听拖拽的控件setOnDragLis...

  • Android自定义控件:打造自己的QQ空间主页

    前面已经实现过仿QQ的List抽屉效果以及仿QQ未读消息拖拽效果,具体请见:Android自定义控件:类QQ抽屉效...

  • HTML5拖拽drag

    通过拖拽实现页面元素的位置改变 实现拖拽效果 源元素 - 要拖拽的文件 目标元素 - 要拖拽到哪里去 目前实现拖拽...

网友评论

      本文标题:C#中实现控件拖拽效果(How to DragDrop Cont

      本文链接:https://www.haomeiwen.com/subject/kbripxtx.html