在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。不知道这样理解有没有错^_^。

最新文章

  1. 记录DIV中滚动位置刷新页面位置保持不变
  2. shell 里的变量 总结
  3. 精通Web Analytics 2.0 (3) 第一章:网站分析的新奇世界
  4. 一道看似简单的sql需求却难倒各路高手 - 你也来挑战下吗?
  5. Model Browser
  6. php socket编程参考资料
  7. Java API —— Math类
  8. Batch file Functions
  9. server 2008 ftp 环境重点说明
  10. Java 实现 SSH 协议的客户端登录认证方式--转载
  11. Duplicate entry &amp;#39;97112&amp;#39; for key 1
  12. Hadoop Steaming开发之WordCount
  13. JS实现多语言方式
  14. Mysql中DDL, DML, DCL, 和TCL是什么?
  15. 3、VNC
  16. [c/c++] programming之路(3)、转义字符及内存
  17. WIN8配置IIS8.0+PHP+Mysql+Zend
  18. android Apk打包过程概述_android是如何打包apk的
  19. nfd指令的详细说明
  20. Java类的成员初始化顺序

热门文章

  1. 转:Git: git stash 用法小结
  2. FFmpeg编译: undefined reference to &#39;av_frame_alloc()&#39;
  3. angular的uiRouter服务学习(3)
  4. (原创)c++11改进我们的模式之改进单例模式
  5. DIOCP开源项目-DIOCP3 大文件的传输DEMO&lt;断点续传&gt;
  6. 【Delphi】基于状态机的串口通信
  7. 【驱动】网卡驱动&#183;linux内核网络分层结构
  8. Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)
  9. 5. 支持向量机(SVM)软间隔
  10. java随机范围内的日期