I have a listview that displays files from a directory.
The user can drag each item in the listview to a folder/ the desktop and the associated file is copied there.
I'd like to point out an small error in the code
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
should be
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
Otherwise a straight Horizontal or Vertical will do nothing. Chances of that happening are small, but still..
The problem here is that you are using SelectedValue for a multiselect, so you get one file. What you want is something more like this:
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);
}
}
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>());
}
restore on MouseMove
foreach (object selItem in _selItems)
{
if (!FileView.SelectedItems.Contains(selItem))
FileView.SelectedItems.Add(selItem);
}