From 13e04caa013bac77871a84d4bb91e8d572ceef6e Mon Sep 17 00:00:00 2001 From: chinboy Date: Mon, 14 Jul 2025 16:49:11 +0800 Subject: [PATCH] Add ColumnDraggingOver Event for datagrid --- .../Cell/DataGridCell.cs | 28 ++++ .../Column/DataGridColumn.cs | 2 +- .../Column/DataGridColumnHeader.Filter.cs | 4 +- .../Column/DataGridColumnHeader.Sorting.cs | 4 +- .../Column/DataGridColumnHeader.cs | 132 +++++++++--------- .../Column/DataGridColumnHeadersPresenter.cs | 55 +------- .../DataGrid.Columns.cs | 15 +- src/AtomUI.Controls.DataGrid/DataGrid.cs | 19 +-- src/AtomUI.Controls.DataGrid/DataGridToken.cs | 31 +--- .../DataGridColumnDraggingOverEventArgs.cs | 20 +++ .../DataGridColumnReorderingEventArgs.cs | 21 +-- .../TokenResourceConst.g.cs | 7 +- .../Themes/DataGridCellTheme.axaml | 4 + .../Themes/DataGridColumnHeaderTheme.axaml | 46 +++--- 14 files changed, 186 insertions(+), 202 deletions(-) create mode 100644 src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnDraggingOverEventArgs.cs diff --git a/src/AtomUI.Controls.DataGrid/Cell/DataGridCell.cs b/src/AtomUI.Controls.DataGrid/Cell/DataGridCell.cs index ebc73e887..1f15585b7 100644 --- a/src/AtomUI.Controls.DataGrid/Cell/DataGridCell.cs +++ b/src/AtomUI.Controls.DataGrid/Cell/DataGridCell.cs @@ -51,6 +51,12 @@ public class DataGridCell : ContentControl nameof(IsSorting), o => o.IsSorting, (o, v) => o.IsSorting = v); + + internal static readonly DirectProperty OwningColumnDraggingProperty = + AvaloniaProperty.RegisterDirect( + nameof(OwningColumnDragging), + o => o.OwningColumnDragging, + (o, v) => o.OwningColumnDragging = v); internal static readonly DirectProperty IsFrozenProperty = AvaloniaProperty.RegisterDirect( @@ -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)); } } diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs index a2a616941..74e778657 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs @@ -224,7 +224,7 @@ public abstract partial class DataGridColumn : AvaloniaObject { get => CanUserReorderInternal ?? OwningGrid?.CanUserReorderColumns ?? - DataGrid.DefaultCanUserResizeColumns; + DataGrid.DefaultCanUserReorderColumns; set => CanUserReorderInternal = value; } diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Filter.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Filter.cs index 02ebcb080..893b6f415 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Filter.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Filter.cs @@ -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) { diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Sorting.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Sorting.cs index 5fb1643d9..a8e458306 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Sorting.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.Sorting.cs @@ -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) { diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs index ceb9a975a..94edf1675 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs @@ -117,6 +117,12 @@ internal partial class DataGridColumnHeader : ContentControl o => o.FrozenShadowPosition, (o, v) => o.FrozenShadowPosition = v); + internal static readonly DirectProperty HeaderDragModeProperty = + AvaloniaProperty.RegisterDirect( + 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; } /// @@ -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; } diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeadersPresenter.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeadersPresenter.cs index d6c7736df..5f086224c 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeadersPresenter.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeadersPresenter.cs @@ -54,39 +54,6 @@ public sealed class DataGridColumnHeadersPresenter : Panel, IChildIndexProvider /// internal Double DragIndicatorOffset { get; set; } - /// - /// The drop location indicator control. This value is null if no column is being dragged. - /// - 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); - } - } - } - } - - /// - /// The distance, in pixels, that the drop location indicator should be positioned away from the left edge - /// of the ColumnsHeaderPresenter. - /// - internal double DropLocationIndicatorOffset { get; set; } - internal DataGrid? OwningGrid { get; set; } event EventHandler? 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); diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs index 4f5378e68..006335ef1 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs @@ -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 的处理结果,需要评审是否合理 diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.cs b/src/AtomUI.Controls.DataGrid/DataGrid.cs index bdc731beb..66a4f311c 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.cs @@ -171,9 +171,6 @@ public partial class DataGrid : TemplatedControl, public static readonly StyledProperty VerticalScrollBarVisibilityProperty = AvaloniaProperty.Register(nameof(VerticalScrollBarVisibility)); - public static readonly StyledProperty> DropLocationIndicatorTemplateProperty = - AvaloniaProperty.Register>(nameof(DropLocationIndicatorTemplate)); - public static readonly DirectProperty SelectedIndexProperty = AvaloniaProperty.RegisterDirect( nameof(SelectedIndex), @@ -460,16 +457,7 @@ public partial class DataGrid : TemplatedControl, get => GetValue(SelectionModeProperty); set => SetValue(SelectionModeProperty, value); } - - /// - /// Gets or sets the template that is used when rendering the column headers. - /// - public ITemplate DropLocationIndicatorTemplate - { - get => GetValue(DropLocationIndicatorTemplateProperty); - set => SetValue(DropLocationIndicatorTemplateProperty, value); - } - + /// /// Gets or sets the index of the current selection. /// @@ -761,6 +749,11 @@ public partial class DataGrid : TemplatedControl, /// a preview should be shown, or cancel reordering. /// public event EventHandler? ColumnReordering; + + /// + /// This event is dispatched when the drag indicator is dragged to a specific column. + /// + public event EventHandler? ColumnDraggingOver; /// /// Occurs when a different cell becomes the current cell. diff --git a/src/AtomUI.Controls.DataGrid/DataGridToken.cs b/src/AtomUI.Controls.DataGrid/DataGridToken.cs index d2211fd83..f76ef78a6 100644 --- a/src/AtomUI.Controls.DataGrid/DataGridToken.cs +++ b/src/AtomUI.Controls.DataGrid/DataGridToken.cs @@ -171,18 +171,6 @@ internal class DataGridToken : AbstractControlDesignToken /// public double SelectionColumnWidth { get; set; } - /// - /// Sticky 模式下滚动条背景色 - /// Background of sticky scrollbar - /// - public Color StickyScrollBarBg { get; set; } - - /// - /// Sticky 模式下滚动条圆角 - /// Border radius of sticky scrollbar - /// - public CornerRadius StickyScrollBarBorderRadius { get; set; } - /// /// 左侧列固定阴影 /// @@ -192,6 +180,11 @@ internal class DataGridToken : AbstractControlDesignToken /// 右侧列固定阴影 /// public BoxShadows RightFrozenShadows { get; set; } + + /// + /// 列拖动排序时候的当前列的背景颜色 + /// + 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; } } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnDraggingOverEventArgs.cs b/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnDraggingOverEventArgs.cs new file mode 100644 index 000000000..3caecdcb8 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnDraggingOverEventArgs.cs @@ -0,0 +1,20 @@ +namespace AtomUI.Controls; + +public class DataGridColumnDraggingOverEventArgs : EventArgs +{ + /// + /// The current DraggingOver column object + /// + public DataGridColumn? DraggingOverColumn { get; } + + /// + /// The column object currently being dragged + /// + public DataGridColumn? DraggedColumn { get; } + + public DataGridColumnDraggingOverEventArgs(DataGridColumn? draggedColumn, DataGridColumn? draggingOverColumn) + { + DraggedColumn = draggedColumn; + DraggingOverColumn = draggingOverColumn; + } +} \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnReorderingEventArgs.cs b/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnReorderingEventArgs.cs index 0092372d4..1d56acf89 100644 --- a/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnReorderingEventArgs.cs +++ b/src/AtomUI.Controls.DataGrid/EventArgs/DataGridColumnReorderingEventArgs.cs @@ -22,27 +22,10 @@ public class DataGridColumnReorderingEventArgs : CancelEventArgs /// /// The column being moved. /// - public DataGridColumn Column - { - get; - private set; - } + public DataGridColumn Column { get; private set; } /// /// The popup indicator displayed while dragging. If null and Handled = true, then do not display a tooltip. /// - public Control? DragIndicator - { - get; - set; - } - - /// - /// UIElement to display at the insertion position. If null and Handled = true, then do not display an insertion indicator. - /// - public Control? DropLocationIndicator - { - get; - set; - } + public Control? DragIndicator { get; set; } } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs b/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs index 0ce04802b..e87812ada 100644 --- a/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs +++ b/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs @@ -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"); diff --git a/src/AtomUI.Controls.DataGrid/Themes/DataGridCellTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/DataGridCellTheme.axaml index faf765c03..c521b985a 100644 --- a/src/AtomUI.Controls.DataGrid/Themes/DataGridCellTheme.axaml +++ b/src/AtomUI.Controls.DataGrid/Themes/DataGridCellTheme.axaml @@ -80,6 +80,10 @@ + + - - - - - - + + + + + + + + + + + + + \ No newline at end of file