在Winform里面实现拖入功能只要设置控件AllowDrop=true;

然后实现方法

//拖入
private void txtInputPath_DragOver(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Link;
}
//拖放结束
private void txtInputPath_Drop(object sender, DragEventArgs e)
{
string[] data = (string[])e.Data.GetData(DataFormats.FileDrop);
if (data == null || data.Length < || !data[].ToLower().EndsWith(".txt"))
return;
txtInputPath.Text = data[];
}

但是,再WPF里面用同样的方法就是不行,实现不了。经过百度后发现,不能使用DrapOver,改为PreviewDragOver就可以了。所以代码修改为:

 /// <summary>
/// 拖入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtInputPath_PreviewDragOver(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Link;
e.Handled = true;//必须加
}
/// <summary>
/// 拖放结束
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtInputPath_PreviewDrop(object sender, DragEventArgs e)
{
string[] data = (string[])e.Data.GetData(DataFormats.FileDrop);
if (data == null || data.Length < || !data[].ToLower().EndsWith(".txt"))
return;
txtInputPath.Text = data[];
}

经过测试,确实就可以了。那么问题来了,为什么Winform里面可以,WPF里面不可以呢。查了下,可能是事件的机制及触发时间不一样吧。

以下是找到的一段翻译是这么说的:

Drag-and-drop操作过程中,会由一系列事件,DragSource包含的Event包括,GiveFeedback、QueryContinueDrag、PreviewGiveFeedback 和 PreviewQueryContinueDrag;DragTarget包含的Event包括:DragEnter[dragged object 进入这个target的边界时],DragLeave[dragged object 离开garget的边界之外],DragOver[dragged object 在target范围内移动],Drop[dragged object 被放置到target内],PreviewDragEnter,PreviewDragLeave,PreviewDragOver,PreviewDrop。

这些Event有两种模型,一个是Bubbling,一个是Tunnelling(带Preview前缀的)。

Bubbling的event是动作发生后触发;Tunnelling的event是动作发生前触发。

那么是不是可以这么理解DragOver里面代码是设置链接方式,但是触发时间点是发生后才触发这个事件,那么这个时候修改e.Effects = DragDropEffects.Link;可能为时已晚,所以要使用PreviewDragOver。不知道这样理解有没有错^_^。

【WPF】鼠标拖拽功能DragOver和Drop的更多相关文章

  1. WPF实现拖拽功能

    技术点:WPF的Behaviors实现了对象的行为附加,Microsoft.Expression.Interactions程序集中包含了若干Behaviors,其中MouseDragElementBe ...

  2. WPF简单拖拽功能实现

    1.拖放操作有两个方面:源和目标. 2.拖放操作通过以下三个步骤进行: ①用户单击元素,并保持鼠标键为按下状态,启动拖放操作. ②用户将鼠标移到其它元素上.如果该元素可接受正在拖动的内容的类型,鼠标指 ...

  3. Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

    Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制 ...

  4. Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能

    /**-------------------------------------------------代码区--------------------------------------------- ...

  5. RCP:拖拽功能的实现 Drag and Drop

    SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...

  6. js进阶 12-17 jquery实现鼠标左键按下拖拽功能

    js进阶 12-17 jquery实现鼠标左键按下拖拽功能 一.总结 一句话总结:监听的对象必须是文档,鼠标按下运行mousemove事件,鼠标松开取消mousemove事件的绑定,div的偏移的话是 ...

  7. WPF 在image控件用鼠标拖拽出矩形

    原文:WPF 在image控件用鼠标拖拽出矩形 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee ...

  8. PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法

    我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...

  9. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

随机推荐

  1. Golang之字符串格式化

    字符串格式化 // Go 之 字符串格式化 // // Copyright (c) 2015 - Batu // package main import ( "fmt" ) typ ...

  2. Socket网络编程--FTP客户端(2)(Windows)

    上一篇FTP客户端讲到如果制作一个简单的FTP客户端,功能实现了,但是后面我们发现了问题,就是FTP是使用明文进行操作的.对于普通情况来说就无所谓了.但有时候要安全的一点的话,就应该使用FTP的安全版 ...

  3. yum rpm 命令一运行就卡住 只有kill 掉

    由于rpm的数据库出现异常导至直接卡死,造成这种异常是因为之前不正常的安装或查询. 解决方法: # rm -f /var/lib/rpm/__db.00* #删除rpm数据文件 # rpm --reb ...

  4. App store 应用审核由于 IPv6 网络问题被拒的一点分析

    App store 应用审核由于 IPv6 网络问题被拒的一点分析   六月以后陆续有一些软件提交市场的时候被拒了,症状基本就是无法登陆啥的.我们公司的应用也未能幸免. 很多同学也想了不少办法,申诉. ...

  5. java 多线程 24 : 线程组

    线程组 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线 ...

  6. Oracle用户密码过期的处理方法

    受影响版本:Oracle11g以上版本.   导致密码消失的原因:Oracle 11g中默认的DEFAULT概要文件中口令有效期PASSWORD_LIFE_TIME默认值为180天.   当以客户端登 ...

  7. C++类默认函数

    问题,which is true??? 每个类都有一个无参构造函数 每个类都有一个拷贝构造函数 每个类可以有多个构造函数 每个类可以多个析构函数 默认构造函数   析构函数   拷贝构造函数   赋值 ...

  8. [转]oracle 11g jdbc jar包在哪个文件目录

    oracle 11g jdbc jar包在哪个文件目录 一. 如果装了Oracle数据库的话, 大致是这样的目录:     D:\oracle\product\11.2.0\client_1\oui\ ...

  9. iOS内存管理和优化 from 刘延军

  10. 火狐FireFox恢复备份失败,无法处理备份文件

    问题:火狐浏览器丢失书签后尝试恢复书签,按[Ctrl + Shift + B]弹出我的足迹,选择[导入和备份]-->[恢复]中任一文件,弹窗[无法处理备份文件]. 解决办法: 先找到并打开火狐浏 ...