Страница: 1 |
Вопрос: WPF Drag out | Добавлено: 30.07.10 00:43 |
Автор вопроса: ![]() |
мне необходимо реализовать следующие операции 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 стоит, и проводник естесно показывает курсор - зачеркнутый кружок, типа низя такого вставить, ну и тем более даже если это удастся, придется как-то остлеживать ситуацию, если юзер отпустит мышку на самом листвью: нужно будет догадываться, либо это из проводника вставка идет элемента, либо юзер просто не донес элемент до проводника и отпустил кнопку. еще такой момент, что когда элемент перетаскиваем в проводник, должно запуститься скачивание файлов и вставится в проводник вместо перетаскиваемых данных, так что хорошо бы отловить событие прямо тогда, когда юзер уже отпускает мышку на проводнике, чтобы лишний раз не качать файлы, если вдруг юзер передумает и нажмет ескейп, например |
Ответы | Всего ответов: 1 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 300-70-6пятьЪ Вопросов: 62 Ответов: 545 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 30.07.10 01:08 |
понял, как устанавливать несколько форматов данных:
но, видимо, придется отказаться от идеи перетаскивания в проводник, потому что заранее сливать фотки в большом разрешении на винт, чтобы быстро сформировать пути для драгндропа, нельзя, вдруг там их много и весят дофига (в листвью я отображаю мелкие превьюхи), а если начинать сливать фотки в MouseMove, то эт тормоза жуткие будут. я прав, выхода нет?) |
Страница: 1 |
|