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); }