1、拖拽需要实现的事件包括:

PreviewMouseLeftButtonDown

LBoxSort_OnDrop

具体实现如下:

 private void LBoxSort_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var pos = e.GetPosition(LBoxSort);
            HitTestResult result = VisualTreeHelper.HitTest(LBoxSort, pos);
            if (result == null)
            {
                return;
            }
            var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);
            if (listBoxItem == null || listBoxItem.Content != LBoxSort.SelectedItem)
            {
                return;
            }
            DataObject dataObj = new DataObject(listBoxItem.Content as Person);
            DragDrop.DoDragDrop(LBoxSort, dataObj, DragDropEffects.Move);

        }

        private void LBoxSort_OnDrop(object sender, DragEventArgs e)
        {
            var pos = e.GetPosition(LBoxSort);
            var result = VisualTreeHelper.HitTest(LBoxSort, pos);
            if (result == null)
            {
                return;
            }
            //查找元数据
            var sourcePerson = e.Data.GetData(typeof (Person)) as Person;
            if (sourcePerson == null)
            {
                return;
            }
            //查找目标数据
            var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);
            if (listBoxItem == null)
            {
                return;
            }
            var targetPerson = listBoxItem.Content as Person;
            if (ReferenceEquals(targetPerson, sourcePerson))
            {
                return;
            }
            _persons.Remove(sourcePerson);
            _persons.Insert(_persons.IndexOf(targetPerson), sourcePerson);
        }
    }
事件实现

相关文章: