private void grid_SelectionDragDelta(object sender, DataGridSelectionDragEventArgs e) { if (_draggingSelection) { var currentPoint = e.GetPosition(null); double offset = currentPoint.Y - _draggingStartPoint.Y; double rowsOffset = 0; int from, to, increment = 1; if (offset > 0) { from = grid.Selection.SelectedRows.Max(r => r.Index) + 1; to = grid.Rows.Count - 1; } else { from = grid.Selection.SelectedRows.Min(r => r.Index) - 1; to = 0; increment = -1; } _rowsNumberOffset = 0; for (int i = from; increment > 0 ? i <= to : i >= to; i += increment) { var rowHeight = grid.Rows[i].ActualHeight * increment; if (increment > 0 ? rowHeight < offset : rowHeight > offset) { rowsOffset += rowHeight; offset -= rowHeight; _rowsNumberOffset += increment; continue; } break; } double selectionHeight = 0; foreach (var selectedRow in grid.Selection.SelectedRows) { selectionHeight += selectedRow.ActualHeight; } foreach (var row in grid.Viewport.Rows) { double y = 0; if (grid.Selection.SelectedRows.Contains(row)) { y = rowsOffset; System.Windows.Controls.Canvas.SetZIndex(row.Presenter, 1); System.Windows.Controls.Canvas.SetZIndex(row.HeaderPresenter, 1); } else { if (increment > 0 ? row.Index >= from && row.Index < from + _rowsNumberOffset : row.Index <= from && row.Index > from + _rowsNumberOffset) { y = -selectionHeight * increment; } System.Windows.Controls.Canvas.SetZIndex(row.Presenter, 0); System.Windows.Controls.Canvas.SetZIndex(row.HeaderPresenter, 0); } var storyboard = row.Presenter.Tag as Storyboard; var animation = storyboard.Children[0] as DoubleAnimation; if (animation.To != y) { animation.To = y; storyboard.Begin(); } var storyboard2 = row.HeaderPresenter.Tag as Storyboard; var animation2 = storyboard2.Children[0] as DoubleAnimation; if (animation2.To != y) { animation2.To = y; storyboard2.Begin(); } } } }
private void grid_SelectionDragCompleted(object sender, DataGridSelectionDragEventArgs e) { if (_draggingSelection) { foreach (var row in grid.Viewport.Rows) { var storyboard = row.Presenter.Tag as Storyboard; storyboard.Stop(); (row.Presenter.RenderTransform as TranslateTransform).Y = 0; var storyboard2 = row.HeaderPresenter.Tag as Storyboard; storyboard2.Stop(); (row.HeaderPresenter.RenderTransform as TranslateTransform).Y = 0; } _draggingSelection = false; var selectedItems = grid.Selection.SelectedRows.Select(r => r.DataItem); var selectionStart = grid.Selection.SelectedRows.Min(r => r.Index); var selectionEnd = grid.Selection.SelectedRows.Max(r => r.Index); for (int i = 0; i < Math.Abs(_rowsNumberOffset); i++) { if (_rowsNumberOffset > 0) { var player = _players[selectionEnd + _rowsNumberOffset]; _players.Remove(player); _players.Insert(selectionStart, player); } else { var player = _players[selectionStart + _rowsNumberOffset]; _players.Remove(player); _players.Insert(selectionEnd, player); } } grid.Selection.BeginUpdate(); grid.Selection.Clear(); foreach (var item in selectedItems) { var row = grid.Rows[item]; grid.Selection.Add(row, row); } grid.Selection.EndUpdate(); } }