private void OrderListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Point p = e.GetPosition(OrderListBox); oldIndex = OrderListBox.GetIndexAtPosition(p); if (oldIndex >= 0) { startPoint = p; } }
private void OrderListBox_DragEnterOrOver(object sender, DragEventArgs e) { int index = OrderListBox.GetIndexAtPosition(e.GetPosition(OrderListBox)); this.RemoveInsertionAdorner(); if (index >= 0) { var container = OrderListBox.ItemContainerGenerator.ContainerFromIndex(index) as FrameworkElement; this.CreateInsertionAdorner(container, e.GetPosition(container).IsInFirstHalf(container, true)); } else if (OrderListBox.HasItems) { var container = OrderListBox.ItemContainerGenerator.ContainerFromIndex(OrderListBox.Items.Count - 1) as FrameworkElement; this.CreateInsertionAdorner(container, false); } //e.Effects = DragDropEffects.Move; }
void OrderListBox_Drop(object sender, DragEventArgs e) { try { this.RemoveInsertionAdorner(); int index = OrderListBox.GetIndexAtPosition(e.GetPosition(OrderListBox)); FrameworkElement container; bool isInFirstHalf = false; if (index >= 0) { container = OrderListBox.ItemContainerGenerator.ContainerFromIndex(index) as FrameworkElement; isInFirstHalf = e.GetPosition(container).IsInFirstHalf(container, true); } else { index = OrderListBox.HasItems ? OrderListBox.Items.Count - 1 : 0; } // Data comes from list itself if (e.Data.GetData(typeof(MediaOrderItem)) != null) { if (oldIndex < 0 || index == oldIndex) { return; } if (index < oldIndex) { index++; } if (isInFirstHalf) { index--; } MediaOrderItem movedItem = orderList[oldIndex]; if (index < 0) { orderList.Move(new MediaOrderItem[] { movedItem }, orderList.Count - oldIndex - 1); } else { orderList.Move(new MediaOrderItem[] { movedItem }, index - oldIndex); } oldIndex = -1; } // Data comes from song list else if (e.Data.GetData(SongDataObject.SongDataFormat) != null) { if (OrderListBox.HasItems) { index++; } if (isInFirstHalf) { index--; } SongData data = (SongData)e.Data.GetData(SongDataObject.SongDataFormat); Media m = MediaManager.LoadMediaMetadata(data.Uri, null); orderList.Insert(index, m); } // Data comes from explorer else if (e.Data.GetData(DataFormats.FileDrop) != null) { if (OrderListBox.HasItems) { index++; } if (isInFirstHalf) { index--; } string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); IEnumerable <Media> result; if (files.Length < 1) { return; } if (files.Length == 1) { if (MediaManager.TryLoadPortfolio(files[0], out result)) { // TODO: maybe insert contents at drop position if the portfolio isn't empty? Controller.OpenPortfolio(files[0]); } else { Media m = MediaManager.LoadMediaMetadata(new Uri(files[0]), null); orderList.Insert(index, m); } } else { foreach (var m in MediaManager.LoadMultipleMediaMetadata(files.Select(f => new Uri(f)))) { orderList.Insert(index++, m); } } } else if (e.Data.GetData(typeof(String)) != null) { string data = (string)e.Data.GetData(typeof(String)); Uri u = null; if (!Uri.TryCreate(data, UriKind.Absolute, out u)) { Uri.TryCreate("http://" + data, UriKind.Absolute, out u); } if (u != null) { Media m = MediaManager.LoadMediaMetadata(u, null); orderList.Insert(index, m); } } } catch (Exception ex) { Controller.ShowUnhandledException(ex, false); } }