2011-02-01 70 views
7

Tôi đang phát triển một ứng dụng tương tự như dropbox và tôi hiển thị các tệp từ xa trên danh sách WPF. Tôi muốn kéo những phần tử đó và thả nó vào cửa sổ thám hiểm. Tôi đã nhìn thấy mã như thế này:WPF: Kéo và thả các tệp ảo vào Windows explorer

var dataObject = new DataObject(DataFormats.FileDrop, files.ToArray()); 
dataObject.SetData(DataFormats.StringFormat, dataObject); 
DoDragDrop(dataObject, DragDropEffects.Copy); 

Nhưng như bạn có thể nghĩ rằng, những tập tin không phải là tại hệ thống địa phương nào, trước khi copiying chúng tôi cần phải kết nối với máy chủ, donwload và giải nén các tập tin. Giống như một khách hàng ftp.

Tôi không làm thế nào để làm điều đó nhưng tôi đã tự hỏi nếu có bất kỳ "thả" sự kiện hoặc tương tự mà tôi có thể xử lý.

Cảm ơn!

Trả lời

4

đoạn này:

var virtualFileDataObject = new VirtualFileDataObject(
       // BeginInvoke ensures UI operations happen on the right thread 
       (vfdo) => Dispatcher.BeginInvoke((Action)(() => BusyScreen.Visibility = Visibility.Visible)), 
       (vfdo) => Dispatcher.BeginInvoke((Action)(() => BusyScreen.Visibility = Visibility.Collapsed))); 

      // Provide a virtual file (downloaded on demand), its URL, and descriptive text 
      virtualFileDataObject.SetData(new VirtualFileDataObject.FileDescriptor[] 
      { 
       new VirtualFileDataObject.FileDescriptor 
       { 
        Name = "DelaysBlog.xml", 
        StreamContents = stream => 
         { 
          using(var webClient = new WebClient()) 
          { 
           var data = webClient.DownloadData("http://blogs.msdn.com/delay/rss.xml"); 
           stream.Write(data, 0, data.Length); 
          } 
         } 
       }, 
      }); 
      virtualFileDataObject.SetData(
       (short)(DataFormats.GetDataFormat(CFSTR_INETURLA).Id), 
       Encoding.Default.GetBytes("http://blogs.msdn.com/delay/rss.xml\0")); 
      virtualFileDataObject.SetData(
       (short)(DataFormats.GetDataFormat(DataFormats.Text).Id), 
       Encoding.Default.GetBytes("[The RSS feed for Delay's Blog]\0")); 

      DoDragDropOrClipboardSetDataObject(e.ChangedButton, TextUrl, virtualFileDataObject, DragDropEffects.Copy); 

Sử dụng lớp linked nên làm việc. . Giải pháp rất đẹp và dễ dàng.

+0

Vui lòng cung cấp tổng quan về những gì liên kết nói. [Câu trả lời chỉ liên kết được khuyến khích] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) vì các liên kết có thể bị chết. Điều này đã có, đến một mức độ nào đó, cho rằng các nội dung ban đầu đã được di chuyển. Theo URL cũ, hiện tại vẫn còn một con trỏ đến URL mới, nhưng ai biết được thời gian sẽ tồn tại ở đó và trong bao lâu thông tin sẽ có sẵn trên URL mới ... –

+0

Cung cấp liên kết đến câu trả lời không phải là câu trả lời, cũng không phải là chất lượng yêu cầu của câu trả lời được nêu trong chính sách sử dụng StackOverflow. Xin vui lòng cung cấp một câu trả lời đúng và tôi sẽ upvote. Cảm ơn -AMR –

1

http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!190.entry http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!199.entry http://pavanpodila.spaces.live.com/blog/cns!9C9E888164859398!225.entry

Xem loạt bài này. Điều này sẽ giúp bạn bắt đầu.

EDIT: Xem này cho một amplementation của dragsourceadvisor

internal class ImagesViewPanelDragSourceAdvisor : IDragSourceAdvisor 
{ 
    private FrameworkElement _dragSource; 

    public DependencyObject DragSource 
    { 
     get 
     { 
      return _dragSource; 
     } 
     set 
     { 
      _dragSource = value as FrameworkElement; 
     } 
    } 

    public DependencyObject DragObject { get; set; } 

    public DragDropEffects GetDragDropEffects() 
    { 
     DragDropEffects effects = DragDropEffects.None; 

     FrameworkElement frameworkObj = DragObject as FrameworkElement; 

     if (frameworkObj != null && frameworkObj.DataContext is ImageViewModel) 
     { 
      effects = DragDropEffects.Copy; 
     } 

     return effects; 
    } 

    public IDataObject GetDragDataObject() 
    { 
     Debug.Assert(GetDragDropEffects() != DragDropEffects.None); 

     ImagesViewModel imagesVM = (FrameworkElement)DragSource).DataContext as ImagesViewModel; 

     StringCollection fileList = new StringCollection(); 

     foreach (ImageViewModel imageVM in imagesVM.Items.Where(imageVM => imageVM.IsSelected)) 
     { 
      fileList.Add(imageVM.ImagePath); 
     } 

     Debug.Assert(fileList.Count > 0); 

     DataObject dataObj = new DataObject(); 

     dataObj.SetFileDropList(fileList); 

     return dataObj; 
    } 

    public void FinishDrag(DragDropEffects finalEffect) 
    { 
    } 
+0

Ví dụ này hoạt động tốt giữa UIElements nhưng không hoạt động (ví dụ như Windows Desktop). Dù sao, cảm ơn vì đã giúp đỡ. – Morvader

+0

Nó sẽ hoạt động tốt bằng cách kéo và thả giữa màn hình và ứng dụng của bạn. Bạn chỉ cần một lớp DropTargetAdvisor thích hợp. Hãy để tôi chỉnh sửa câu trả lời của tôi với một ví dụ – NVM

+0

Xin lỗi nhưng nó chỉ là quá dài để giải thích toàn bộ điều ở đây. Điều duy nhất bạn cần thay đổi là việc triển khai DropTargetAdvisor và DragSourceAdvisor một cách thích hợp. Những gì bạn có thể làm là làm những gì các liên kết làm trong ứng dụng của bạn và sau đó đặt breakpoints trong các lớp cố vấn và xem những gì được kéo và thả giữa máy tính để bàn và ứng dụng của bạn và sau đó mã cho phù hợp. HTH. – NVM

Các vấn đề liên quan