private void Move()
        {
            if (_draggingContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
            {
                return;
            }

            var screenPos = new Win32.POINT();

            if (!Win32.GetCursorPos(ref screenPos))
            {
                return;
            }

            var posToPanel   = treeView.PointFromScreen(new Point(screenPos.X, screenPos.Y));
            var draggingRect = new Rect(posToPanel.X - _cacheMouseDownPosToChild.X, posToPanel.Y - _cacheMouseDownPosToChild.Y, _draggingContainer.ActualWidth, _draggingContainer.ActualHeight);

            if (DoubleUtil.GreaterThan(draggingRect.X, treeView.ActualWidth * 3 / 4) ||
                DoubleUtil.LessThan(draggingRect.Right, treeView.ActualWidth / 4) ||
                DoubleUtil.LessThan(draggingRect.Bottom, 0) ||
                DoubleUtil.GreaterThan(draggingRect.Y, treeView.ActualHeight))
            {
                return;
            }

            var sourcePos = _draggingContainer.TranslatePoint(new Point(), treeView);
            var isSuccess = false;

            if (MoveDirection(sourcePos, draggingRect))
            {
                isSuccess = MoveUp(treeView, draggingRect, ref _draggingContainer, ref _lastOverlapContainer, ref _startOverlapTime);
            }
            else
            {
                isSuccess = MoveDown(treeView, draggingRect, ref _draggingContainer, ref _lastOverlapContainer, ref _startOverlapTime);
            }

            if (isSuccess && _draggingContainer != null)
            {
                _draggingContainer.Focus();
                _draggingContainer.Opacity = 0.2;

                _testSource.ItemsChangedFlag = !_testSource.ItemsChangedFlag;
            }
        }
        private bool MoveDown(MultiSelectTreeView rootTreeView, Rect draggingRect, ref MultiSelectTreeViewItem draggingContainer, ref MultiSelectTreeViewItem lastOverlapContainer, ref DateTime startOverlapTime)
        {
            Size overlapSize     = new Size();
            Rect overlapItemRect = new Rect();
            MultiSelectTreeViewItem overlapContainer = null;

            var sourceItemsControl = ItemsControl.ItemsControlFromItemContainer(draggingContainer);

            if (sourceItemsControl == null)
            {
                return(false);
            }

            var sourceCollection = sourceItemsControl.ItemsSource as IList <TestModel>;
            var sourceIndex      = sourceItemsControl.ItemContainerGenerator.IndexFromContainer(draggingContainer);
            var sourceItem       = sourceCollection[sourceIndex];

            var sourcePos = draggingContainer.TranslatePoint(new Point(), rootTreeView);

            //从组中分离
            if (IsFromGroup(sourceItemsControl) && sourceIndex == sourceItemsControl.Items.Count - 1 && DoubleUtil.GreaterThan(draggingRect.Y, sourcePos.Y + draggingContainer.ActualHeight / 2))
            {
                //加入上层集合
                var superItemsControl = ItemsControl.ItemsControlFromItemContainer(sourceItemsControl);
                var superCollection   = superItemsControl.ItemsSource as IList <TestModel>;
                var superIndex        = superItemsControl.ItemContainerGenerator.IndexFromContainer(sourceItemsControl);

                sourceCollection.RemoveAt(sourceIndex);
                if (superIndex + 1 < superItemsControl.Items.Count)
                {
                    superCollection.Insert(superIndex + 1, sourceItem);
                    draggingContainer = ContainerFromIndex(superItemsControl, superIndex + 1) as MultiSelectTreeViewItem;
                }
                else
                {
                    superCollection.Add(sourceItem);
                    draggingContainer = ContainerFromIndex(superItemsControl, superCollection.Count - 1) as MultiSelectTreeViewItem;
                }

                //原组若剩余一项,则将该项加入上层集合,移除组
                if (sourceItemsControl.Items.Count == 1)
                {
                    sourceItem = sourceCollection[0];
                    sourceCollection.RemoveAt(0);

                    superCollection.Insert(superIndex + 1, sourceItem);
                    superCollection.RemoveAt(superIndex);
                }

                lastOverlapContainer = null;
                return(true);
            }

            if (!FindFirstDownItemWithValidOverlap(rootTreeView, sourceItemsControl, sourceIndex + 1, draggingContainer, draggingRect, ref overlapSize, ref overlapItemRect, ref overlapContainer))
            {
                return(false);
            }

            var targetItemsControl = ItemsControl.ItemsControlFromItemContainer(overlapContainer);
            var targetCollection   = targetItemsControl.ItemsSource as IList <TestModel>;
            var targetIndex        = targetItemsControl.ItemContainerGenerator.IndexFromContainer(overlapContainer);

            if (DoubleUtil.LessThan(draggingRect.Bottom, overlapItemRect.Y + overlapItemRect.Height / 2))
            {
                //Do noting
            }
            else if (DoubleUtil.LessThan(draggingRect.Bottom, overlapItemRect.Y + overlapItemRect.Height * 3 / 4)) // 1/4 -> 3/4 height
            {
                //非同组,则加入
                if (IsFromGroup(targetItemsControl) && targetItemsControl != sourceItemsControl)
                {
                    sourceCollection.RemoveAt(sourceIndex);
                    targetCollection.Insert(0, sourceItem);

                    lastOverlapContainer = null;
                    draggingContainer    = ContainerFromIndex(targetItemsControl, 0) as MultiSelectTreeViewItem;
                }
            }
            else if (DoubleUtil.GreaterThan(draggingRect.Y, overlapItemRect.Y + overlapItemRect.Height / 4)) //Top -> 1/4 height 移动
            {
                sourceCollection.RemoveAt(sourceIndex);
                targetCollection.Insert(targetIndex, sourceItem);

                lastOverlapContainer = null;
                draggingContainer    = ContainerFromIndex(targetItemsControl, targetIndex) as MultiSelectTreeViewItem;
            }
            else //处理悬停,创建新组
            {
                if (!DealHover(
                        targetItemsControl, targetCollection, targetIndex,
                        sourceCollection, sourceIndex, sourceItem,
                        targetIndex - 1, overlapContainer,
                        ref lastOverlapContainer, ref startOverlapTime))
                {
                    return(false);
                }
            }

            return(true);
        }