mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-28 23:08:36 +08:00
Add ColumnDraggingOver Event for datagrid
This commit is contained in:
@@ -51,6 +51,12 @@ public class DataGridCell : ContentControl
|
||||
nameof(IsSorting),
|
||||
o => o.IsSorting,
|
||||
(o, v) => o.IsSorting = v);
|
||||
|
||||
internal static readonly DirectProperty<DataGridCell, bool> OwningColumnDraggingProperty =
|
||||
AvaloniaProperty.RegisterDirect<DataGridCell, bool>(
|
||||
nameof(OwningColumnDragging),
|
||||
o => o.OwningColumnDragging,
|
||||
(o, v) => o.OwningColumnDragging = v);
|
||||
|
||||
internal static readonly DirectProperty<DataGridCell, bool> IsFrozenProperty =
|
||||
AvaloniaProperty.RegisterDirect<DataGridCell, bool>(
|
||||
@@ -84,6 +90,14 @@ public class DataGridCell : ContentControl
|
||||
internal set => SetAndRaise(IsSortingProperty, ref _isSorting, value);
|
||||
}
|
||||
|
||||
bool _owningColumnDragging = false;
|
||||
|
||||
public bool OwningColumnDragging
|
||||
{
|
||||
get => _owningColumnDragging;
|
||||
internal set => SetAndRaise(OwningColumnDraggingProperty, ref _owningColumnDragging, value);
|
||||
}
|
||||
|
||||
bool _isFrozen = false;
|
||||
|
||||
internal bool IsFrozen
|
||||
@@ -344,6 +358,20 @@ public class DataGridCell : ContentControl
|
||||
return false;
|
||||
},
|
||||
BindingPriority.Template));
|
||||
_compositeDisposable.Add(BindUtils.RelayBind(OwningColumn.HeaderCell,
|
||||
DataGridColumnHeader.HeaderDragModeProperty,
|
||||
this,
|
||||
OwningColumnDraggingProperty,
|
||||
(v) =>
|
||||
{
|
||||
if (OwningColumn is not DataGridFillerColumn)
|
||||
{
|
||||
return v == DataGridColumnHeader.DragMode.Reorder;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
BindingPriority.Template));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -224,7 +224,7 @@ public abstract partial class DataGridColumn : AvaloniaObject
|
||||
{
|
||||
get => CanUserReorderInternal ??
|
||||
OwningGrid?.CanUserReorderColumns ??
|
||||
DataGrid.DefaultCanUserResizeColumns;
|
||||
DataGrid.DefaultCanUserReorderColumns;
|
||||
set => CanUserReorderInternal = value;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ internal partial class DataGridColumnHeader
|
||||
(OwningColumn.CanUserFilter || OwningGrid.CanUserFilterColumns))
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(OwningColumn);
|
||||
OwningGrid.HandleColumnFiltering(ea);
|
||||
OwningGrid.NotifyColumnFiltering(ea);
|
||||
if (!ea.Handled && OwningGrid.DataConnection.AllowFilter &&
|
||||
OwningGrid.DataConnection.FilterDescriptions != null)
|
||||
{
|
||||
@@ -151,7 +151,7 @@ internal partial class DataGridColumnHeader
|
||||
(OwningColumn.CanUserFilter || OwningGrid.CanUserFilterColumns))
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(OwningColumn);
|
||||
OwningGrid.HandleColumnFiltering(ea);
|
||||
OwningGrid.NotifyColumnFiltering(ea);
|
||||
if (!ea.Handled && OwningGrid.DataConnection.AllowFilter &&
|
||||
OwningGrid.DataConnection.FilterDescriptions != null)
|
||||
{
|
||||
|
||||
@@ -189,7 +189,7 @@ internal partial class DataGridColumnHeader
|
||||
(OwningColumn.CanUserSort || OwningGrid.CanUserSortColumns))
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(OwningColumn);
|
||||
OwningGrid.HandleColumnSorting(ea);
|
||||
OwningGrid.NotifyColumnSorting(ea);
|
||||
if (!ea.Handled && OwningGrid.DataConnection.AllowSort &&
|
||||
OwningGrid.DataConnection.SortDescriptions != null)
|
||||
{
|
||||
@@ -351,7 +351,7 @@ internal partial class DataGridColumnHeader
|
||||
(OwningColumn.CanUserSort || OwningGrid.CanUserSortColumns))
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(OwningColumn);
|
||||
OwningGrid.HandleColumnSorting(ea);
|
||||
OwningGrid.NotifyColumnSorting(ea);
|
||||
if (!ea.Handled && OwningGrid.DataConnection.AllowSort &&
|
||||
OwningGrid.DataConnection.SortDescriptions != null)
|
||||
{
|
||||
|
||||
@@ -117,6 +117,12 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
o => o.FrozenShadowPosition,
|
||||
(o, v) => o.FrozenShadowPosition = v);
|
||||
|
||||
internal static readonly DirectProperty<DataGridColumnHeader, DragMode> HeaderDragModeProperty =
|
||||
AvaloniaProperty.RegisterDirect<DataGridColumnHeader, DragMode>(
|
||||
nameof(HeaderDragMode),
|
||||
o => o.HeaderDragMode,
|
||||
(o, v) => o.HeaderDragMode = v);
|
||||
|
||||
private bool _isFirstVisible = false;
|
||||
internal bool IsFirstVisible
|
||||
{
|
||||
@@ -139,6 +145,13 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
}
|
||||
}
|
||||
|
||||
private DragMode _headerDragMode = DragMode.None;
|
||||
internal DragMode HeaderDragMode
|
||||
{
|
||||
get => _headerDragMode;
|
||||
set => SetAndRaise(HeaderDragModeProperty, ref _headerDragMode, value);
|
||||
}
|
||||
|
||||
private bool _isMiddleVisible = false;
|
||||
internal bool IsMiddleVisible
|
||||
{
|
||||
@@ -149,7 +162,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
PseudoClasses.Set(DataGridPseudoClass.MiddleColumnHeader, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal SizeType SizeType
|
||||
{
|
||||
get => GetValue(SizeTypeProperty);
|
||||
@@ -229,13 +242,13 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
private const int ResizeRegionWidth = 5;
|
||||
private const int ColumnsDragThreshold = 5;
|
||||
|
||||
private static DragMode _dragMode;
|
||||
private static Point? _lastMousePositionHeaders;
|
||||
private static Cursor? _originalCursor;
|
||||
private static double _originalHorizontalOffset;
|
||||
private static double _originalWidth;
|
||||
private static Point? _dragStart;
|
||||
private static DataGridColumn? _dragColumn;
|
||||
private static DataGridColumn? _currentDraggingOverColumn;
|
||||
private static double _frozenColumnsWidth;
|
||||
private bool _areHandlersSuspended;
|
||||
private bool _desiredSeparatorVisibility = true;
|
||||
@@ -321,7 +334,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
|
||||
if (OwningGrid != null && OwningGrid.ColumnHeaders != null)
|
||||
{
|
||||
_dragMode = DragMode.MouseDown;
|
||||
HeaderDragMode = DragMode.MouseDown;
|
||||
_frozenColumnsWidth = OwningGrid.ColumnsInternal.GetVisibleFrozenEdgedColumnsWidth();
|
||||
_lastMousePositionHeaders = this.Translate(OwningGrid.ColumnHeaders, mousePosition);
|
||||
|
||||
@@ -335,17 +348,17 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
previousColumn = OwningGrid.ColumnsInternal.GetPreviousVisibleNonFillerColumn(currentColumn);
|
||||
}
|
||||
|
||||
if (_dragMode == DragMode.MouseDown && _dragColumn == null && (distanceFromRight <= ResizeRegionWidth))
|
||||
if (HeaderDragMode == DragMode.MouseDown && _dragColumn == null && (distanceFromRight <= ResizeRegionWidth))
|
||||
{
|
||||
Debug.Assert(currentColumn != null);
|
||||
handled = TrySetResizeColumn(currentColumn);
|
||||
}
|
||||
else if (_dragMode == DragMode.MouseDown && _dragColumn == null && distanceFromLeft <= ResizeRegionWidth && previousColumn != null)
|
||||
else if (HeaderDragMode == DragMode.MouseDown && _dragColumn == null && distanceFromLeft <= ResizeRegionWidth && previousColumn != null)
|
||||
{
|
||||
handled = TrySetResizeColumn(previousColumn);
|
||||
}
|
||||
|
||||
if (_dragMode == DragMode.Resize && _dragColumn != null)
|
||||
if (HeaderDragMode == DragMode.Resize && _dragColumn != null)
|
||||
{
|
||||
_dragStart = _lastMousePositionHeaders;
|
||||
_originalWidth = _dragColumn.ActualWidth;
|
||||
@@ -364,11 +377,11 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
|
||||
if (OwningGrid != null && OwningGrid.ColumnHeaders != null)
|
||||
{
|
||||
if (_dragMode == DragMode.MouseDown)
|
||||
if (HeaderDragMode == DragMode.MouseDown)
|
||||
{
|
||||
HandleMouseLeftButtonUpClick(args.KeyModifiers, ref handled);
|
||||
}
|
||||
else if (_dragMode == DragMode.Reorder)
|
||||
else if (HeaderDragMode == DragMode.Reorder)
|
||||
{
|
||||
// Find header we're hovering over
|
||||
int targetIndex = GetReorderingTargetDisplayIndex(mousePositionHeaders);
|
||||
@@ -388,8 +401,8 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
// Variables that track drag mode states get reset in DataGridColumnHeader_LostMouseCapture
|
||||
args.Pointer.Capture(null);
|
||||
HandleLostMouseCapture();
|
||||
_dragMode = DragMode.None;
|
||||
handled = true;
|
||||
HeaderDragMode = DragMode.None;
|
||||
handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -443,7 +456,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
Debug.Assert(OwningGrid != null);
|
||||
return OwningGrid.CanUserReorderColumns
|
||||
&& !(column is DataGridFillerColumn)
|
||||
&& (column.CanUserReorderInternal.HasValue && column.CanUserReorderInternal.Value || !column.CanUserReorderInternal.HasValue);
|
||||
&& column.CanUserReorderInternal.HasValue && column.CanUserReorderInternal.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -464,14 +477,14 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
return column.ActualCanUserResize;
|
||||
}
|
||||
|
||||
private static bool TrySetResizeColumn(DataGridColumn column)
|
||||
private bool TrySetResizeColumn(DataGridColumn column)
|
||||
{
|
||||
// If datagrid.CanUserResizeColumns == false, then the column can still override it
|
||||
if (CanResizeColumn(column))
|
||||
{
|
||||
_dragColumn = column;
|
||||
|
||||
_dragMode = DragMode.Resize;
|
||||
HeaderDragMode = DragMode.Resize;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -661,16 +674,20 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
{
|
||||
_dragColumn.HeaderCell.Cursor = _originalCursor;
|
||||
}
|
||||
_dragMode = DragMode.None;
|
||||
HeaderDragMode = DragMode.None;
|
||||
_dragColumn = null;
|
||||
_dragStart = null;
|
||||
_lastMousePositionHeaders = null;
|
||||
|
||||
_currentDraggingOverColumn = null;
|
||||
DataGridColumnDraggingOverEventArgs draggingOverEventArgs =
|
||||
new DataGridColumnDraggingOverEventArgs(null, null);
|
||||
OwningGrid?.NotifyColumnDraggingOver(draggingOverEventArgs);
|
||||
|
||||
if (OwningGrid != null && OwningGrid.ColumnHeaders != null)
|
||||
{
|
||||
OwningGrid.ColumnHeaders.DragColumn = null;
|
||||
OwningGrid.ColumnHeaders.DragIndicator = null;
|
||||
OwningGrid.ColumnHeaders.DropLocationIndicator = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -698,47 +715,44 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
Debug.Assert(OwningColumn != null);
|
||||
var dragIndicator = new DataGridColumnHeader
|
||||
{
|
||||
OwningColumn = OwningColumn,
|
||||
IsEnabled = false,
|
||||
Content = GetDragIndicatorContent(Content, ContentTemplate)
|
||||
OwningColumn = OwningColumn,
|
||||
IsEnabled = false,
|
||||
Content = GetDragIndicatorContent(Content, ContentTemplate),
|
||||
IsSeparatorsVisible = false,
|
||||
IsVisible = false
|
||||
};
|
||||
dragIndicator.PseudoClasses.Add(StdPseudoClass.DragIndicator);
|
||||
|
||||
Control? dropLocationIndicator = OwningGrid.DropLocationIndicatorTemplate?.Build();
|
||||
|
||||
// If the user didn't style the dropLocationIndicator's Height, default to the column header's height
|
||||
if (dropLocationIndicator != null && double.IsNaN(dropLocationIndicator.Height) && dropLocationIndicator is Control element)
|
||||
{
|
||||
element.Height = Bounds.Height;
|
||||
}
|
||||
|
||||
|
||||
// pass the caret's data template to the user for modification
|
||||
DataGridColumnReorderingEventArgs columnReorderingEventArgs = new DataGridColumnReorderingEventArgs(OwningColumn)
|
||||
{
|
||||
DropLocationIndicator = dropLocationIndicator,
|
||||
DragIndicator = dragIndicator
|
||||
};
|
||||
OwningGrid.HandleColumnReordering(columnReorderingEventArgs);
|
||||
OwningGrid.NotifyColumnReordering(columnReorderingEventArgs);
|
||||
if (columnReorderingEventArgs.Cancel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// The user didn't cancel, so prepare for the reorder
|
||||
_dragColumn = OwningColumn;
|
||||
_dragMode = DragMode.Reorder;
|
||||
_dragStart = mousePosition;
|
||||
_dragColumn = OwningColumn;
|
||||
HeaderDragMode = DragMode.Reorder;
|
||||
_dragStart = mousePosition;
|
||||
|
||||
Debug.Assert(OwningGrid.ColumnHeaders != null);
|
||||
// Display the reordering thumb
|
||||
OwningGrid.ColumnHeaders.DragColumn = OwningColumn;
|
||||
OwningGrid.ColumnHeaders.DragIndicator = columnReorderingEventArgs.DragIndicator;
|
||||
OwningGrid.ColumnHeaders.DropLocationIndicator = columnReorderingEventArgs.DropLocationIndicator;
|
||||
|
||||
// If the user didn't style the dragIndicator's Width, default it to the column header's width
|
||||
if (double.IsNaN(dragIndicator.Width))
|
||||
{
|
||||
dragIndicator.Width = Bounds.Width;
|
||||
dragIndicator.Width = DesiredSize.Width;
|
||||
}
|
||||
|
||||
if (double.IsNaN(dragIndicator.Height))
|
||||
{
|
||||
dragIndicator.Height = DesiredSize.Height;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,7 +765,10 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
|
||||
if (content is Control control)
|
||||
{
|
||||
if (VisualRoot == null) return content;
|
||||
if (VisualRoot == null)
|
||||
{
|
||||
return content;
|
||||
}
|
||||
control.Measure(Size.Infinity);
|
||||
var rect = new Rectangle()
|
||||
{
|
||||
@@ -759,7 +776,8 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
Height = control.DesiredSize.Height,
|
||||
Fill = new VisualBrush
|
||||
{
|
||||
Visual = control, Stretch = Stretch.None, AlignmentX = AlignmentX.Left,
|
||||
Visual = control,
|
||||
Stretch = Stretch.Fill
|
||||
}
|
||||
};
|
||||
return rect;
|
||||
@@ -783,7 +801,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
Debug.Assert(OwningColumn != null);
|
||||
Debug.Assert(OwningGrid.ColumnHeaders != null);
|
||||
//handle entry into reorder mode
|
||||
if (_dragMode == DragMode.MouseDown && _dragColumn == null && _lastMousePositionHeaders != null)
|
||||
if (HeaderDragMode == DragMode.MouseDown && _dragColumn == null && _lastMousePositionHeaders != null)
|
||||
{
|
||||
var distanceFromInitial = (Vector)(mousePositionHeaders - _lastMousePositionHeaders);
|
||||
if (distanceFromInitial.Length > ColumnsDragThreshold)
|
||||
@@ -798,38 +816,24 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
}
|
||||
|
||||
//handle reorder mode (eg, positioning of the popup)
|
||||
if (_dragMode == DragMode.Reorder && OwningGrid.ColumnHeaders.DragIndicator != null)
|
||||
if (HeaderDragMode == DragMode.Reorder && OwningGrid.ColumnHeaders.DragIndicator != null)
|
||||
{
|
||||
Debug.Assert(_dragStart != null);
|
||||
// Find header we're hovering over
|
||||
|
||||
DataGridColumn? targetColumn = GetReorderingTargetColumn(mousePositionHeaders, !OwningColumn.IsFrozen /*scroll*/, out double scrollAmount);
|
||||
|
||||
if (_currentDraggingOverColumn != targetColumn)
|
||||
{
|
||||
DataGridColumnDraggingOverEventArgs draggingOverEventArgs =
|
||||
new DataGridColumnDraggingOverEventArgs(_dragColumn, targetColumn);
|
||||
OwningGrid.NotifyColumnDraggingOver(draggingOverEventArgs);
|
||||
_currentDraggingOverColumn = targetColumn;
|
||||
}
|
||||
|
||||
OwningGrid.ColumnHeaders.DragIndicatorOffset = mousePosition.X - _dragStart.Value.X + scrollAmount;
|
||||
OwningGrid.ColumnHeaders.InvalidateArrange();
|
||||
|
||||
if (OwningGrid.ColumnHeaders.DropLocationIndicator != null)
|
||||
{
|
||||
Point targetPosition = new Point(0, 0);
|
||||
if (targetColumn == null || targetColumn == OwningGrid.ColumnsInternal.FillerColumn || targetColumn.IsFrozen != OwningColumn.IsFrozen)
|
||||
{
|
||||
targetColumn =
|
||||
OwningGrid.ColumnsInternal.GetLastColumn(
|
||||
isVisible: true,
|
||||
isFrozen: OwningColumn.IsFrozen,
|
||||
isReadOnly: null);
|
||||
if (targetColumn != null)
|
||||
{
|
||||
targetPosition = targetColumn.HeaderCell.Translate(OwningGrid.ColumnHeaders, targetPosition);
|
||||
targetPosition = targetPosition.WithX(targetPosition.X + targetColumn.ActualWidth);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
targetPosition = targetColumn.HeaderCell.Translate(OwningGrid.ColumnHeaders, targetPosition);
|
||||
}
|
||||
OwningGrid.ColumnHeaders.DropLocationIndicatorOffset = targetPosition.X - scrollAmount;
|
||||
}
|
||||
|
||||
|
||||
handled = true;
|
||||
}
|
||||
}
|
||||
@@ -841,7 +845,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
return;
|
||||
}
|
||||
Debug.Assert(OwningGrid != null);
|
||||
if (_dragMode == DragMode.Resize && _dragColumn != null && _dragStart.HasValue)
|
||||
if (HeaderDragMode == DragMode.Resize && _dragColumn != null && _dragStart.HasValue)
|
||||
{
|
||||
// resize column
|
||||
double mouseDelta = mousePositionHeaders.X - _dragStart.Value.X;
|
||||
@@ -860,7 +864,7 @@ internal partial class DataGridColumnHeader : ContentControl
|
||||
|
||||
private void SetDragCursor(Point mousePosition)
|
||||
{
|
||||
if (_dragMode != DragMode.None || OwningGrid == null || OwningColumn == null)
|
||||
if (HeaderDragMode != DragMode.None || OwningGrid == null || OwningColumn == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,39 +54,6 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider
|
||||
/// </summary>
|
||||
internal Double DragIndicatorOffset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The drop location indicator control. This value is null if no column is being dragged.
|
||||
/// </summary>
|
||||
internal Control? DropLocationIndicator
|
||||
{
|
||||
get => _dropLocationIndicator;
|
||||
set
|
||||
{
|
||||
if (value != _dropLocationIndicator)
|
||||
{
|
||||
if (_dropLocationIndicator != null)
|
||||
{
|
||||
if (Children.Contains(_dropLocationIndicator))
|
||||
{
|
||||
Children.Remove(_dropLocationIndicator);
|
||||
}
|
||||
}
|
||||
|
||||
_dropLocationIndicator = value;
|
||||
if (_dropLocationIndicator != null)
|
||||
{
|
||||
Children.Add(_dropLocationIndicator);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The distance, in pixels, that the drop location indicator should be positioned away from the left edge
|
||||
/// of the ColumnsHeaderPresenter.
|
||||
/// </summary>
|
||||
internal double DropLocationIndicatorOffset { get; set; }
|
||||
|
||||
internal DataGrid? OwningGrid { get; set; }
|
||||
|
||||
event EventHandler<ChildIndexChangedEventArgs>? IChildIndexProvider.ChildIndexChanged
|
||||
@@ -143,7 +110,7 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider
|
||||
double frozenRightEdge = finalSize.Width;
|
||||
double scrollingLeftEdge = -OwningGrid.HorizontalOffset;
|
||||
var visibleColumnIndex = 0;
|
||||
var VisibleColumnCount = OwningGrid.ColumnsInternal.GetDisplayedColumnCount();
|
||||
var visibleColumnCount = OwningGrid.ColumnsInternal.GetDisplayedColumnCount();
|
||||
foreach (DataGridColumn dataGridColumn in OwningGrid.ColumnsInternal.GetVisibleColumns())
|
||||
{
|
||||
DataGridColumnHeader columnHeader = dataGridColumn.HeaderCell;
|
||||
@@ -172,7 +139,7 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider
|
||||
// }
|
||||
columnHeader.IsFrozen = true;
|
||||
columnHeader.FrozenShadowPosition = FrozenColumnShadowPosition.Left;
|
||||
columnHeader.IsShowFrozenShadow = (visibleColumnIndex == VisibleColumnCount - OwningGrid.RightFrozenColumnCount) && OwningGrid.HorizontalOffset < OwningGrid.HorizontalMaximizeOffset;
|
||||
columnHeader.IsShowFrozenShadow = (visibleColumnIndex == visibleColumnCount - OwningGrid.RightFrozenColumnCount) && OwningGrid.HorizontalOffset < OwningGrid.HorizontalMaximizeOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -191,22 +158,16 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider
|
||||
{
|
||||
if (DragIndicator != null)
|
||||
{
|
||||
DragIndicator.IsVisible = true;
|
||||
EnsureColumnReorderingClip(DragIndicator, finalSize.Height, frozenLeftEdge, dragIndicatorLeftEdge);
|
||||
|
||||
var height = DragIndicator.Bounds.Height;
|
||||
if (height <= 0)
|
||||
height = DragIndicator.DesiredSize.Height;
|
||||
|
||||
DragIndicator.Arrange(new Rect(dragIndicatorLeftEdge, 0, DragIndicator.Bounds.Width, height));
|
||||
}
|
||||
if (DropLocationIndicator != null)
|
||||
{
|
||||
if (DropLocationIndicator is Control element)
|
||||
{
|
||||
EnsureColumnReorderingClip(element, finalSize.Height, frozenLeftEdge, DropLocationIndicatorOffset);
|
||||
height = DragIndicator.DesiredSize.Height;
|
||||
}
|
||||
|
||||
DropLocationIndicator.Arrange(new Rect(DropLocationIndicatorOffset, 0, DropLocationIndicator.Bounds.Width, DropLocationIndicator.Bounds.Height));
|
||||
|
||||
DragIndicator.Arrange(new Rect(dragIndicatorLeftEdge, 0, DragIndicator.Bounds.Width, height));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -416,10 +377,6 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider
|
||||
{
|
||||
DragIndicator.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
|
||||
}
|
||||
if (DropLocationIndicator != null)
|
||||
{
|
||||
DropLocationIndicator.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
|
||||
}
|
||||
|
||||
OwningGrid.ColumnsInternal.EnsureVisibleEdgedColumnsWidth();
|
||||
return new Size(OwningGrid.ColumnsInternal.VisibleEdgedColumnsWidth, height);
|
||||
|
||||
@@ -117,17 +117,22 @@ public partial class DataGrid
|
||||
ColumnReordered?.Invoke(this, e);
|
||||
}
|
||||
|
||||
protected internal virtual void HandleColumnReordering(DataGridColumnReorderingEventArgs e)
|
||||
protected internal virtual void NotifyColumnReordering(DataGridColumnReorderingEventArgs e)
|
||||
{
|
||||
ColumnReordering?.Invoke(this, e);
|
||||
}
|
||||
|
||||
protected internal virtual void NotifyColumnDraggingOver(DataGridColumnDraggingOverEventArgs e)
|
||||
{
|
||||
ColumnDraggingOver?.Invoke(this, e);
|
||||
}
|
||||
|
||||
protected internal virtual void HandleColumnSorting(DataGridColumnEventArgs e)
|
||||
protected internal virtual void NotifyColumnSorting(DataGridColumnEventArgs e)
|
||||
{
|
||||
Sorting?.Invoke(this, e);
|
||||
}
|
||||
|
||||
protected internal virtual void HandleColumnFiltering(DataGridColumnEventArgs e)
|
||||
protected internal virtual void NotifyColumnFiltering(DataGridColumnEventArgs e)
|
||||
{
|
||||
Filtering?.Invoke(this, e);
|
||||
}
|
||||
@@ -184,7 +189,7 @@ public partial class DataGrid
|
||||
foreach (var column in ColumnsInternal)
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(column);
|
||||
HandleColumnSorting(ea);
|
||||
NotifyColumnSorting(ea);
|
||||
}
|
||||
|
||||
// TODO 我们这里没有判断 HandleColumnSorting 的处理结果,需要评审是否合理
|
||||
@@ -253,7 +258,7 @@ public partial class DataGrid
|
||||
foreach (var column in ColumnsInternal)
|
||||
{
|
||||
var ea = new DataGridColumnEventArgs(column);
|
||||
HandleColumnFiltering(ea);
|
||||
NotifyColumnFiltering(ea);
|
||||
}
|
||||
|
||||
// TODO 我们这里没有判断 HandleColumnSorting 的处理结果,需要评审是否合理
|
||||
|
||||
@@ -171,9 +171,6 @@ public partial class DataGrid : TemplatedControl,
|
||||
public static readonly StyledProperty<ScrollBarVisibility> VerticalScrollBarVisibilityProperty =
|
||||
AvaloniaProperty.Register<DataGrid, ScrollBarVisibility>(nameof(VerticalScrollBarVisibility));
|
||||
|
||||
public static readonly StyledProperty<ITemplate<Control>> DropLocationIndicatorTemplateProperty =
|
||||
AvaloniaProperty.Register<DataGrid, ITemplate<Control>>(nameof(DropLocationIndicatorTemplate));
|
||||
|
||||
public static readonly DirectProperty<DataGrid, int> SelectedIndexProperty =
|
||||
AvaloniaProperty.RegisterDirect<DataGrid, int>(
|
||||
nameof(SelectedIndex),
|
||||
@@ -460,16 +457,7 @@ public partial class DataGrid : TemplatedControl,
|
||||
get => GetValue(SelectionModeProperty);
|
||||
set => SetValue(SelectionModeProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the template that is used when rendering the column headers.
|
||||
/// </summary>
|
||||
public ITemplate<Control> DropLocationIndicatorTemplate
|
||||
{
|
||||
get => GetValue(DropLocationIndicatorTemplateProperty);
|
||||
set => SetValue(DropLocationIndicatorTemplateProperty, value);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the index of the current selection.
|
||||
/// </summary>
|
||||
@@ -761,6 +749,11 @@ public partial class DataGrid : TemplatedControl,
|
||||
/// a preview should be shown, or cancel reordering.
|
||||
/// </summary>
|
||||
public event EventHandler<DataGridColumnReorderingEventArgs>? ColumnReordering;
|
||||
|
||||
/// <summary>
|
||||
/// This event is dispatched when the drag indicator is dragged to a specific column.
|
||||
/// </summary>
|
||||
public event EventHandler<DataGridColumnDraggingOverEventArgs>? ColumnDraggingOver;
|
||||
|
||||
/// <summary>
|
||||
/// Occurs when a different cell becomes the current cell.
|
||||
|
||||
@@ -171,18 +171,6 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
/// </summary>
|
||||
public double SelectionColumnWidth { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Sticky 模式下滚动条背景色
|
||||
/// Background of sticky scrollbar
|
||||
/// </summary>
|
||||
public Color StickyScrollBarBg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Sticky 模式下滚动条圆角
|
||||
/// Border radius of sticky scrollbar
|
||||
/// </summary>
|
||||
public CornerRadius StickyScrollBarBorderRadius { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 左侧列固定阴影
|
||||
/// </summary>
|
||||
@@ -192,6 +180,11 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
/// 右侧列固定阴影
|
||||
/// </summary>
|
||||
public BoxShadows RightFrozenShadows { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 列拖动排序时候的当前列的背景颜色
|
||||
/// </summary>
|
||||
public Color ColumnReorderActiveBg { get; set; }
|
||||
|
||||
#region 内部 Token
|
||||
|
||||
@@ -248,12 +241,6 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
|
||||
public CornerRadius TableTopLeftColumnCornerRadius { get; set; }
|
||||
|
||||
// Virtual Scroll Bar
|
||||
public double TableScrollThumbSize { get; set; }
|
||||
public Color TableScrollThumbBg { get; set; }
|
||||
public Color TableScrollThumbBgHover { get; set; }
|
||||
public Color TableScrollBg { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
protected override void CalculateFromAlias()
|
||||
@@ -295,8 +282,6 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
FilterDropdownBg = SharedToken.ColorBgContainer;
|
||||
ExpandIconBg = SharedToken.ColorBgContainer;
|
||||
SelectionColumnWidth = SharedToken.ControlHeight;
|
||||
StickyScrollBarBg = SharedToken.ColorTextPlaceholder;
|
||||
StickyScrollBarBorderRadius = new CornerRadius(100);
|
||||
ExpandIconMargin = new Thickness(0,
|
||||
(SharedToken.FontSize * SharedToken.FontHeight - SharedToken.LineWidth * 3) / 2 -
|
||||
Math.Ceiling((SharedToken.FontSizeSM * 1.4 - SharedToken.LineWidth * 3) / 2),
|
||||
@@ -360,11 +345,6 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
TableFilterButtonContainerMargin = new Thickness(0, SharedToken.UniformlyMarginXS, 0, 0);
|
||||
TableFilterButtonLayoutSeparatorMargin = new Thickness(0, SharedToken.UniformlyMarginXXS, 0, 0);
|
||||
TableFilterDropdownPadding = SharedToken.PaddingXS;
|
||||
// Virtual Scroll Bar
|
||||
TableScrollThumbSize = 8;
|
||||
TableScrollThumbBg = StickyScrollBarBg;
|
||||
TableScrollThumbBgHover = SharedToken.ColorTextHeading;
|
||||
TableScrollBg = SharedToken.ColorSplit;
|
||||
LeftFrozenShadows = new BoxShadows(new BoxShadow
|
||||
{
|
||||
OffsetX = -10,
|
||||
@@ -381,5 +361,6 @@ internal class DataGridToken : AbstractControlDesignToken
|
||||
Spread = 0,
|
||||
Color = SharedToken.ColorSplit
|
||||
});
|
||||
ColumnReorderActiveBg = colorFillContentSolid;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
namespace AtomUI.Controls;
|
||||
|
||||
public class DataGridColumnDraggingOverEventArgs : EventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The current DraggingOver column object
|
||||
/// </summary>
|
||||
public DataGridColumn? DraggingOverColumn { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The column object currently being dragged
|
||||
/// </summary>
|
||||
public DataGridColumn? DraggedColumn { get; }
|
||||
|
||||
public DataGridColumnDraggingOverEventArgs(DataGridColumn? draggedColumn, DataGridColumn? draggingOverColumn)
|
||||
{
|
||||
DraggedColumn = draggedColumn;
|
||||
DraggingOverColumn = draggingOverColumn;
|
||||
}
|
||||
}
|
||||
@@ -22,27 +22,10 @@ public class DataGridColumnReorderingEventArgs : CancelEventArgs
|
||||
/// <summary>
|
||||
/// The column being moved.
|
||||
/// </summary>
|
||||
public DataGridColumn Column
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
public DataGridColumn Column { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The popup indicator displayed while dragging. If null and Handled = true, then do not display a tooltip.
|
||||
/// </summary>
|
||||
public Control? DragIndicator
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UIElement to display at the insertion position. If null and Handled = true, then do not display an insertion indicator.
|
||||
/// </summary>
|
||||
public Control? DropLocationIndicator
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
public Control? DragIndicator { get; set; }
|
||||
}
|
||||
+1
-6
@@ -12,6 +12,7 @@ namespace AtomUI.Theme.Styling
|
||||
public static readonly TokenResourceKey CellPadding = new TokenResourceKey("DataGrid.CellPadding");
|
||||
public static readonly TokenResourceKey CellPaddingMD = new TokenResourceKey("DataGrid.CellPaddingMD");
|
||||
public static readonly TokenResourceKey CellPaddingSM = new TokenResourceKey("DataGrid.CellPaddingSM");
|
||||
public static readonly TokenResourceKey ColumnReorderActiveBg = new TokenResourceKey("DataGrid.ColumnReorderActiveBg");
|
||||
public static readonly TokenResourceKey ExpandIconBg = new TokenResourceKey("DataGrid.ExpandIconBg");
|
||||
public static readonly TokenResourceKey ExpandIconHalfInner = new TokenResourceKey("DataGrid.ExpandIconHalfInner");
|
||||
public static readonly TokenResourceKey ExpandIconMargin = new TokenResourceKey("DataGrid.ExpandIconMargin");
|
||||
@@ -41,8 +42,6 @@ namespace AtomUI.Theme.Styling
|
||||
public static readonly TokenResourceKey SelectionColumnWidth = new TokenResourceKey("DataGrid.SelectionColumnWidth");
|
||||
public static readonly TokenResourceKey SortIconSize = new TokenResourceKey("DataGrid.SortIconSize");
|
||||
public static readonly TokenResourceKey SortIndicatorLayoutMargin = new TokenResourceKey("DataGrid.SortIndicatorLayoutMargin");
|
||||
public static readonly TokenResourceKey StickyScrollBarBg = new TokenResourceKey("DataGrid.StickyScrollBarBg");
|
||||
public static readonly TokenResourceKey StickyScrollBarBorderRadius = new TokenResourceKey("DataGrid.StickyScrollBarBorderRadius");
|
||||
public static readonly TokenResourceKey TableBg = new TokenResourceKey("DataGrid.TableBg");
|
||||
public static readonly TokenResourceKey TableBodySortBg = new TokenResourceKey("DataGrid.TableBodySortBg");
|
||||
public static readonly TokenResourceKey TableBorderColor = new TokenResourceKey("DataGrid.TableBorderColor");
|
||||
@@ -74,10 +73,6 @@ namespace AtomUI.Theme.Styling
|
||||
public static readonly TokenResourceKey TablePaddingSmall = new TokenResourceKey("DataGrid.TablePaddingSmall");
|
||||
public static readonly TokenResourceKey TableRadius = new TokenResourceKey("DataGrid.TableRadius");
|
||||
public static readonly TokenResourceKey TableRowHoverBg = new TokenResourceKey("DataGrid.TableRowHoverBg");
|
||||
public static readonly TokenResourceKey TableScrollBg = new TokenResourceKey("DataGrid.TableScrollBg");
|
||||
public static readonly TokenResourceKey TableScrollThumbBg = new TokenResourceKey("DataGrid.TableScrollThumbBg");
|
||||
public static readonly TokenResourceKey TableScrollThumbBgHover = new TokenResourceKey("DataGrid.TableScrollThumbBgHover");
|
||||
public static readonly TokenResourceKey TableScrollThumbSize = new TokenResourceKey("DataGrid.TableScrollThumbSize");
|
||||
public static readonly TokenResourceKey TableSelectedRowBg = new TokenResourceKey("DataGrid.TableSelectedRowBg");
|
||||
public static readonly TokenResourceKey TableSelectedRowHoverBg = new TokenResourceKey("DataGrid.TableSelectedRowHoverBg");
|
||||
public static readonly TokenResourceKey TableSelectionColumnWidth = new TokenResourceKey("DataGrid.TableSelectionColumnWidth");
|
||||
|
||||
@@ -80,6 +80,10 @@
|
||||
<Style Selector="^[IsSorting=True]">
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.BodySortBg}}"/>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[OwningColumnDragging=True]">
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.ColumnReorderActiveBg}}"/>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[IsShowFrozenShadow=True]">
|
||||
<Style Selector="^[FrozenShadowPosition=Left]">
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
<Setter Property="atom:ToolTip.IsCustomShowAndHide" Value="True" />
|
||||
<Setter Property="HorizontalContentAlignment" Value="Left" />
|
||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||
<Setter Property="ClipToBounds" Value="False"/>
|
||||
<Setter Property="ClipToBounds" Value="False" />
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.TableHeaderBg}}" />
|
||||
<Style Selector="^[ShowSorterTooltip=True]">
|
||||
<Setter Property="atom:ToolTip.ServiceEnabled" Value="True" />
|
||||
@@ -167,24 +167,38 @@
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[IsShowFrozenShadow=True]">
|
||||
|
||||
<Style Selector="^:drag-indicator">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.TableHeaderBg}}" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[FrozenShadowPosition=Left]">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="BoxShadow" Value="{DynamicResource {x:Static atom:DataGridTokenKey.LeftFrozenShadows}}"/>
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[FrozenShadowPosition=Right]">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="BoxShadow" Value="{DynamicResource {x:Static atom:DataGridTokenKey.RightFrozenShadows}}"/>
|
||||
</Style>
|
||||
<Setter Property="Background" Value="#808080" />
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[HeaderDragMode=Reorder]">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.ColumnReorderActiveBg}}" />
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[IsShowFrozenShadow=True]">
|
||||
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="Background" Value="{DynamicResource {x:Static atom:DataGridTokenKey.TableHeaderBg}}" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[FrozenShadowPosition=Left]">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="BoxShadow"
|
||||
Value="{DynamicResource {x:Static atom:DataGridTokenKey.LeftFrozenShadows}}" />
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
<Style Selector="^[FrozenShadowPosition=Right]">
|
||||
<Style Selector="^ /template/ Border#PART_Frame">
|
||||
<Setter Property="BoxShadow"
|
||||
Value="{DynamicResource {x:Static atom:DataGridTokenKey.RightFrozenShadows}}" />
|
||||
</Style>
|
||||
</Style>
|
||||
</Style>
|
||||
|
||||
</Style>
|
||||
</ControlTheme>
|
||||
Reference in New Issue
Block a user