在WPF中检测拖放文件?

15

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

4个回答

9
尝试以下操作:

    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;
    }

6

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


干杯!您的想法也在这里讨论:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a539c487-1dec-4935-b91b-c3ec252eb834 - NoizWaves

3

事实证明,由于某些原因,我无法将内容拖放到文本框中,但是将其拖放到按钮上却可以正常工作。通过在窗口中添加“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
    }
  }            
}

0

我曾经遇到过类似的问题,拖放事件和拖入事件都没有被触发。问题出在Windows用户账户设置上。将其设置为最不安全的选项,然后尝试相同的代码,它就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接