首先设置ListView的AllowDrop=True;SelectionMode=Extended;并且ListView视图为GridVIew。
直接上源码:
private void listView1_MouseMove(object sender, MouseEventArgs e)
{
ListView listview = sender as ListView;
if (e.LeftButton == MouseButtonState.Pressed)
{
System.Collections.IList list = listview.SelectedItems as System.Collections.IList;
DataObject data = new DataObject(typeof(System.Collections.IList), list);
if (list.Count > 0)
{
DragDrop.DoDragDrop(listview, data, DragDropEffects.Move);
}
}
}
private void listView1_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(System.Collections.IList)))
{
System.Collections.IList peopleList = e.Data.GetData(typeof(System.Collections.IList)) as System.Collections.IList;
//index为放置时鼠标下元素项的索引
int index = GetCurrentIndex(new GetPositionDelegate(e.GetPosition));
if (index > -1)
{
LogMessage Logmess = peopleList[0] as LogMessage;
//拖动元素集合的第一个元素索引
int OldFirstIndex = StreamHelper.List.IndexOf(Logmess);
//下边那个循环要求数据源必须为ObservableCollection<T>类型,T为对象
for (int i = 0; i < peopleList.Count; i++)
{
StreamHelper.List.Move(OldFirstIndex, index);
}
listView1.SelectedItems.Clear();
}
}
}
private int GetCurrentIndex(GetPositionDelegate getPosition)
{
int index = -1;
for (int i = 0; i < listView1.Items.Count; ++i)
{
ListViewItem item = GetListViewItem(i);
if (item != null && this.IsMouseOverTarget(item, getPosition))
{
index = i;
break;
}
}
return index;
}
private bool IsMouseOverTarget(Visual target, GetPositionDelegate getPosition)
{
Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
Point mousePos = getPosition((IInputElement)target);
return bounds.Contains(mousePos);
}
delegate Point GetPositionDelegate(IInputElement element);
ListViewItem GetListViewItem(int index)
{
if (listView1.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
return null;
return listView1.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;
}
其中StreamHelper.List是StreamHelper类里边有一个静态的ObservableCollection<LogMessage>集合名字为List;
LogMessage就是集合里边的T对象了;