我有一个列表视图,可以显示目录中的文件。
用户可以将列表视图中的每个项目拖到文件夹/桌面,并且关联的文件被复制到那里。
这可以很好地工作。问题是--我想对多个项目这样做--这样用户就可以选择多个列表条目,并将它们拖放到一起。ListView被设置为SelectedMode=Multiple-但它不会复制所有选定的项目。下面是我的代码:
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);
}
}谢谢!
发布于 2011-08-04 00:37:54
这里的问题是,您使用SelectedValue进行多选操作,因此只能得到一个文件。你需要的是更像这样的东西:
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);
}
}发布于 2013-11-01 01:38:04
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);
}发布于 2013-04-24 08:35:16
我想指出代码中的一个小错误
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)应该是
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)否则,直线、水平或垂直将不起任何作用。这种情况发生的可能性很小,但仍然..
https://stackoverflow.com/questions/6929474
复制相似问题