在 WPF 中检测 Drag'n'Drop 文件?

Posted

技术标签:

【中文标题】在 WPF 中检测 Drag\'n\'Drop 文件?【英文标题】:Detect Drag'n'Drop file in WPF?在 WPF 中检测 Drag'n'Drop 文件? 【发布时间】:2010-09-24 20:59:49 【问题描述】:

是否可以让 WPF 窗口/元素检测从 C# .Net 3.5 中的 Windows 资源管理器拖放文件?我找到了适用于 WinForms 的解决方案,但没有找到适用于 WPF 的解决方案。

【问题讨论】:

【参考方案1】:

尝试以下方法:

    private void MessageTextBox_Drop(object sender, DragEventArgs e)
    
        if (e.Data is DataObject && ((DataObject)e.Data).ContainsFileDropList())
        
            foreach (string filePath in ((DataObject)e.Data).GetFileDropList())
            
                // Processing here     
            
        
    


    private void MessageTextBox_PreviewDragEnter(object sender, DragEventArgs e)
    
        var dropPossible = e.Data != null && ((DataObject)e.Data).ContainsFileDropList();
        if (dropPossible)
        
            e.Effects = DragDropEffects.Copy;
        
    

    private void MessageTextBox_PreviewDragOver(object sender, DragEventArgs e)
    
        e.Handled = true;
    

【讨论】:

【参考方案2】:

不幸的是,TextBox、RichTextBox 和 FlowDocument 查看器总是将拖放事件标记为已处理,从而防止它们冒泡到您的处理程序。您可以通过强制处理拖放事件(使用 UIElement.AddHandler 并将handledEventsToo 设置为true)并在处理程序中将e.Handled 设置为false 来恢复被这些控件拦截的拖放事件。

【讨论】:

干杯!您的想法也在这里讨论:social.msdn.microsoft.com/forums/en-US/wpf/thread/…【参考方案3】:

原来由于某种原因我不能放到我的 TextBox 上,但是放到按钮上可以正常工作。通过将 'AllowDrop="True"' 添加到我的窗口并将放置事件处理程序添加到包含以下内容的按钮来使其工作:

private void btnFindType_Drop(object sender, DragEventArgs e)

  if (e.Data is System.Windows.DataObject &&
    ((System.Windows.DataObject)e.Data).ContainsFileDropList())
  
    foreach (string filePath in ((System.Windows.DataObject)e.Data).GetFileDropList())
    
      // Processing here
    
              

【讨论】:

【参考方案4】:

我有类似的问题,放置事件和拖动输入事件没有被触发。问题出在 Windows 用户帐户设置上。将其设置为最不安全的设置并尝试使用相同的代码。

【讨论】:

以上是关于在 WPF 中检测 Drag'n'Drop 文件?的主要内容,如果未能解决你的问题,请参考以下文章

WPF实现Drag/Drop操作

如果打开一个对话框,则始终启用WPF拖放

在 WPF 文本框中删除文件

处理外部程序的 wpf drop

解决WPF中TextBox文件拖放问题

检测 WPF 验证错误