мне необходимо реализовать следующие операции 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 стоит, и проводник естесно показывает курсор - зачеркнутый кружок, типа низя такого вставить, ну и тем более даже если это удастся, придется как-то остлеживать ситуацию, если юзер отпустит мышку на самом листвью: нужно будет догадываться, либо это из проводника вставка идет элемента, либо юзер просто не донес элемент до проводника и отпустил кнопку.
 
 
еще такой момент, что когда элемент перетаскиваем в проводник, должно запуститься скачивание файлов и вставится в проводник вместо перетаскиваемых данных, так что хорошо бы отловить событие прямо тогда, когда юзер уже отпускает мышку на проводнике, чтобы лишний раз не качать файлы, если вдруг юзер передумает и нажмет ескейп, например
Ответить
        |