мне необходимо реализовать следующие операции drag'n'drop для листвью: перемещение элемента в пределах самого листвью (т.е. просто менять элементы местами), вставка элемента при перетаскивании из проводника, и вставка элемента из листвью в проводник. 1,2 я сделал, вот код:
private void albumsListView_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
startPointAlbumsListView = e.GetPosition(null);
oldIndexAlbumsViewList = this.GetCurrentIndex(albumsListView, e.GetPosition);
}
private void albumsListView_MouseMove(object sender, MouseEventArgs e)
{
{
Point mousePos = e.GetPosition(null);
Vector diff = startPointAlbumsListView - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
ListView listView = sender as ListView;
ListViewItem listViewItem =
FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
if (listViewItem != null)
{
Album album = //albums[oldIndexAlbumsViewList];
(Album)listView.ItemContainerGenerator.
ItemFromContainer(listViewItem);
DataObject dragData = new DataObject("albumFormat", album);
DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Move);
}
}
}
}
private void albumsListView_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent("albumFormat") || !e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effects = DragDropEffects.None;
}
}
private void albumsListView_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("albumFormat"))
{
//меняем альбомы местами
}
else if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
//создаем альбомы на основе папок из проводника
}
}
вопрос такой, а как сделать drag'n'drop ИЗ листвью В проводник?
если просто в MouseMove добавить еще
DataObject dragData2 = new DataObject(DataFormats.FileDrop, album.Photos.Select(ph => ph.Src).ToArray());
DragDrop.DoDragDrop(listViewItem, dragData2, DragDropEffects.Copy);
то в проводник приходит только результат первого DoDragDrop, в котором формат данных albumFormat стоит, и проводник естесно показывает курсор - зачеркнутый кружок, типа низя такого вставить, ну и тем более даже если это удастся, придется как-то остлеживать ситуацию, если юзер отпустит мышку на самом листвью: нужно будет догадываться, либо это из проводника вставка идет элемента, либо юзер просто не донес элемент до проводника и отпустил кнопку.
еще такой момент, что когда элемент перетаскиваем в проводник, должно запуститься скачивание файлов и вставится в проводник вместо перетаскиваемых данных, так что хорошо бы отловить событие прямо тогда, когда юзер уже отпускает мышку на проводнике, чтобы лишний раз не качать файлы, если вдруг юзер передумает и нажмет ескейп, например
Ответить
|