WPF: Drag and drop virtual files into Windows explorer

后端 未结 2 941
孤街浪徒
孤街浪徒 2021-01-02 14:33

I\'m developing an application similar to dropbox and i show the remote files on a WPF listview. I want to drag those elements and drop it into windows explorer. I\'ve seen

相关标签:
2条回答
  • 2021-01-02 15:22

    This snippet:

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

    Using the class linked should work. . Very nice and easy solution.

    0 讨论(0)
  • 2021-01-02 15:33

    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

    See this series of articles. This should help you get started.

    EDIT: See this for an amplementation of the 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 讨论(0)
提交回复
热议问题