首页 > 技术文章 > WPF ListView 简单的拖拽实现(转)

lijianda 2017-03-23 10:07 原文

 

首先设置ListView的AllowDrop=True;SelectionMode=Extended;并且ListView视图为GridVIew。

 1 private void listView1_MouseMove(object sender, MouseEventArgs e)  
 2       {  
 3           ListView listview = sender as ListView;  
 4           if (e.LeftButton == MouseButtonState.Pressed)  
 5           {  
 6               System.Collections.IList list = listview.SelectedItems as System.Collections.IList;  
 7               DataObject data = new DataObject(typeof(System.Collections.IList), list);  
 8               if (list.Count > 0)  
 9               {  
10                   DragDrop.DoDragDrop(listview, data, DragDropEffects.Move);  
11               }  
12           }  
13       }  
14   
15       private void listView1_Drop(object sender, DragEventArgs e)  
16       {  
17           if (e.Data.GetDataPresent(typeof(System.Collections.IList)))  
18           {  
19               System.Collections.IList peopleList = e.Data.GetData(typeof(System.Collections.IList)) as System.Collections.IList;  
20               //index为放置时鼠标下元素项的索引  
21               int index = GetCurrentIndex(new GetPositionDelegate(e.GetPosition));  
22               if (index > -1)  
23               {  
24                   LogMessage Logmess = peopleList[0] as LogMessage;  
25                   //拖动元素集合的第一个元素索引  
26                   int OldFirstIndex = StreamHelper.List.IndexOf(Logmess);  
27                   //下边那个循环要求数据源必须为ObservableCollection<T>类型,T为对象  
28                   for (int i = 0; i < peopleList.Count; i++)  
29                   {  
30                       StreamHelper.List.Move(OldFirstIndex, index);  
31                   }  
32                   listView1.SelectedItems.Clear();  
33               }  
34           }  
35       }  
36   
37       private int GetCurrentIndex(GetPositionDelegate getPosition)  
38       {  
39           int index = -1;  
40           for (int i = 0; i < listView1.Items.Count; ++i)  
41           {  
42               ListViewItem item = GetListViewItem(i);  
43               if (item != null && this.IsMouseOverTarget(item, getPosition))  
44               {  
45                   index = i;  
46                   break;  
47               }  
48           }  
49           return index;  
50       }  
51   
52       private bool IsMouseOverTarget(Visual target, GetPositionDelegate getPosition)  
53       {  
54           Rect bounds = VisualTreeHelper.GetDescendantBounds(target);  
55           Point mousePos = getPosition((IInputElement)target);  
56           return bounds.Contains(mousePos);  
57       }  
58   
59       delegate Point GetPositionDelegate(IInputElement element);  
60   
61       ListViewItem GetListViewItem(int index)  
62       {  
63           if (listView1.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)  
64               return null;  
65           return listView1.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem;  
66       }  

其中StreamHelper.List是StreamHelper类里边有一个静态的ObservableCollection<LogMessage>集合名字为List;

LogMessage就是集合里边的T对象了;

推荐阅读