Add ColumnDraggingOver Event for datagrid

This commit is contained in:
chinboy
2025-07-14 16:49:11 +08:00
parent d2b43ef15f
commit 13e04caa01
14 changed files with 186 additions and 202 deletions
@@ -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 的处理结果,需要评审是否合理
+6 -13
View File
@@ -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.
+6 -25
View File
@@ -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; }
}
@@ -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>