2011-02-01 5 views
7

Я разрабатываю приложение, подобное dropbox, и я показываю удаленные файлы в представлении WPF. Я хочу перетащить эти элементы и отбросить их в Windows Explorer. Я видел такой код:WPF: перетаскивание виртуальных файлов в Windows explorer

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

Но, как вы думаете, те, файл не в локальной системе еще до copiying их мне нужно подключиться к серверу, DONWLOAD и распаковать файлы. Как и клиент ftp.

Я не знаю, как это сделать, но мне было интересно, есть ли какое-либо событие «падения» или похожее, с которым я могу справиться.

Спасибо!

ответ

4

Этот фрагмент кода:

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

Использование класса linked должен работать. , Очень приятное и простое решение.

+0

Просьба дать обзор того, что говорит ссылка. [Ответы только на ссылки не приветствуются] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers), поскольку ссылки могут исчезнуть. Это уже в некоторой степени объясняется тем, что исходное содержимое было перемещено. В соответствии со старым URL-адресом в настоящее время все еще указатель на новый URL-адрес, но кто знает, как долго он останется там, и как долго информация будет доступна по новому URL-адресу ... –

+0

Предоставление ссылки на ответ не является ответом и не является качеством, необходимым для ответа, описанного в политике использования StackOverflow. Пожалуйста, предоставьте правильный ответ, и я продолжу. Спасибо -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

Смотрите эту серию статей. Это должно помочь вам начать работу.

EDIT: Смотрите это для amplementation из 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

Эти примеры отлично работают между UIElements, но не из них (например, Windows Desktop). Во всяком случае, спасибо за помощь. – Morvader

+0

Он отлично работает с перетаскиванием между рабочим столом и вашим приложением. Вам просто нужен соответствующий класс DropTargetAdvisor. Позвольте мне изменить свой ответ на примере – NVM

+0

Извините, но слишком долго, чтобы объяснить все это здесь. Единственное, что вам нужно изменить, - это реализовать DropTargetAdvisor и DragSourceAdvisor соответствующим образом. Что вы можете сделать, так это сделать то, что делают ссылки в вашем приложении, а затем установить точки останова в классах советников и посмотреть, что происходит перетаскивание между рабочим столом и вашим приложением, а затем код соответственно. НТН. – NVM

Смежные вопросы