2011-08-03 3 views
2

J'ai un listview qui affiche les fichiers d'un répertoire.
L'utilisateur peut faire glisser chaque élément de la liste dans un dossier/bureau et le fichier associé y est copié.
Cela fonctionne très bien. Le problème est - je veux le faire pour plusieurs éléments - afin que l'utilisateur puisse sélectionner plusieurs listviewitems et les faire glisser et les copier ensemble. ListView est défini sur SelectedMode = Multiple, mais il ne copie pas tous les éléments sélectionnés. Voici mon code:Faites glisser plusieurs éléments de WPF listview

private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     this.start = e.GetPosition(null); 
    } 

    private void FileView_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point mpos = e.GetPosition(null); 
     Vector diff = this.start - mpos; 

     if (e.LeftButton == MouseButtonState.Pressed && 
      Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance && 
      Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 
     { 
      if (this.FileView.SelectedItems.Count == 0) 
      { 
       return; 
      } 

      // right about here you get the file urls of the selected items. 
      // should be quite easy, if not, ask. 
      string[] files = new String[1]; 
      files[0] = "C:\\Users\\MyName\\Music\\My playlist\\" + FileView.SelectedValue.ToString(); 
      string dataFormat = DataFormats.FileDrop; 
      DataObject dataObject = new DataObject(dataFormat, files); 
      DragDrop.DoDragDrop(this.FileView, dataObject, DragDropEffects.Copy); 
     } 
    } 

Merci!

Répondre

4

Le problème ici est que vous utilisez SelectedValue pour un multiselect, donc vous obtenez un fichier. Ce que vous voulez est quelque chose comme ceci:

private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    this.start = e.GetPosition(null); 
} 

private void FileView_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mpos = e.GetPosition(null); 
    Vector diff = this.start - mpos; 

    if (e.LeftButton == MouseButtonState.Pressed && 
     Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance && 
     Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 
    { 
     if (this.FileView.SelectedItems.Count == 0) 
      return; 

     // right about here you get the file urls of the selected items. 
     // should be quite easy, if not, ask. 
     string[] files = new String[FileView.SelectedItems.Count]; 
     int ix = 0; 
     foreach (object nextSel in FileView.SelectedItems) 
     { 
      files[ix] = "C:\\Users\\MyName\\Music\\My playlist\\" + nextSel.ToString(); 
      ++ix; 
     } 
     string dataFormat = DataFormats.FileDrop; 
     DataObject dataObject = new DataObject(dataFormat, files); 
     DragDrop.DoDragDrop(this.FileView, dataObject, DragDropEffects.Copy); 
    } 
} 
+0

Impressionnant! Merci! – amitairos

2

Je voudrais signaler une petite erreur dans le code

Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance && 
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 

devrait être

Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || 
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 

Sinon, une droite horizontale ou Vertical ne fera rien. Il y a des chances que cela se produise sont petites, mais toujours ..

+0

... ou utilisez la propriété Vector's Length à la place –

3
private List<object> _selItems = new List<object>(); 
    private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     this._start = e.GetPosition(null); 
     _selItems.Clear(); 
     _selItems.AddRange(FileView.SelectedItems.Cast<object>()); 

    } 

restaurer sur MouseMove

foreach (object selItem in _selItems) 
      { 
       if (!FileView.SelectedItems.Contains(selItem)) 
        FileView.SelectedItems.Add(selItem); 
      } 
+0

Merci pour cela, c'est exactement ce dont j'avais besoin. La sélection passait à l'élément sous le curseur avant que je puisse saisir tous les éléments sélectionnés. – user3557327

Questions connexes