2011-08-03 13 views
2

ディレクトリからファイルを表示するリストビューがあります。
ユーザーは、リストビューの各項目をフォルダ/デスクトップにドラッグすると、関連するファイルがそこにコピーされます。
これは正常に動作します。問題は、複数のアイテムに対してそうしたいということです。ユーザーは複数のリストビュー項目を選択し、それらを一緒にドラッグアンドコピーすることができます。 ListViewはSelectedMode = Multiple-に設定されていますが、選択した項目のすべてをコピーするわけではありません。WPFリストビューから複数の項目をドラッグ

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

ありがとう: はここに私のコードです!

答えて

4

ここで問題となるのは、複数選択にSelectedValueを使用しているため、1つのファイルが得られるということです。何がしたいことより、このようなものです:私は、コード

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

の小さなエラーを指摘したいと思います

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

驚くばかりに復元..しかし、まだ、小さいです!ありがとう! – amitairos

2

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

でなければなりませんそれ以外の場合はまっすぐ水平または垂直は何もしません。その出来事のチャンスは

+0

...代わりにベクトルの長さプロパティを使用してください –

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

    } 

のMouseMove

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

これは、正確に私が必要としていたものです。選択項目がカーソルの下の1つの項目に変更されてから、選択したすべての項目を取得できました。 – user3557327

関連する問題