using HandyControl.Controls; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Documents; using System.Windows.Media; namespace Main.Test; public class DataGridHelper { /// /// /// /// /// public static string GetNoDataTips(DependencyObject obj) { return (string)obj.GetValue(NoDataTipsProperty); } /// /// /// /// /// public static void SetNoDataTips(DependencyObject obj, string value) { obj.SetValue(NoDataTipsProperty, value); } public static readonly DependencyProperty NoDataTipsProperty = DependencyProperty.RegisterAttached("NoDataTips", typeof(string), typeof(DataGridHelper),new PropertyMetadata("无数据")); /// /// /// /// /// public static bool GetIsActive(DependencyObject obj) { return (bool)obj.GetValue(IsActiveProperty); } /// /// /// /// /// public static void SetIsActive(DependencyObject obj, bool value) { obj.SetValue(IsActiveProperty, value); } public static readonly DependencyProperty IsActiveProperty = DependencyProperty.RegisterAttached("IsActive", typeof(bool), typeof(DataGridHelper)); public static DependencyProperty ShowRowNumberProperty = DependencyProperty.RegisterAttached("ShowRowNumber", typeof(bool), typeof(DataGridHelper), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits, OnShowRowNumberChanged)); public static bool GetShowRowNumber(DependencyObject target) => (bool)target.GetValue(ShowRowNumberProperty); public static void SetShowRowNumber(DependencyObject target, bool value) { target.SetValue(ShowRowNumberProperty, value); } private static void OnShowRowNumberChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) { if (target is not DataGrid dataGrid) return; var show = (bool)e.NewValue; if (show) { dataGrid.LoadingRow += DataGrid_LoadingRow; dataGrid.ItemContainerGenerator.ItemsChanged += ItemContainerGeneratorItemsChanged; } else { dataGrid.LoadingRow -= DataGrid_LoadingRow; dataGrid.ItemContainerGenerator.ItemsChanged -= ItemContainerGeneratorItemsChanged; } void ItemContainerGeneratorItemsChanged(object sender, ItemsChangedEventArgs e) { var generator = dataGrid.ItemContainerGenerator; var itemsCount = dataGrid.Items.Count; if (show) { for (var i = 0; i < itemsCount; i++) { var row = (DataGridRow)generator.ContainerFromIndex(i); if (row != null) { row.Header = (i + 1).ToString(); } } } else { for (var i = 0; i < itemsCount; i++) { var row = (DataGridRow)generator.ContainerFromIndex(i); if (row != null) { row.Header = null; } } } } } private static void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { e.Row.Header = (e.Row.GetIndex() + 1).ToString(); } public static readonly DependencyProperty ShowBorderProperty = DependencyProperty.RegisterAttached("ShowBorder", typeof(bool), typeof(DataGridHelper), new PropertyMetadata(false, OnShowBorderChanged)); public static void SetShowBorder(DependencyObject element, bool value) => element.SetValue(ShowBorderProperty, value); public static bool GetShowBorder(DependencyObject element) => (bool)element.GetValue(ShowBorderProperty); private static void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is DataGridColumnHeader header && (bool)e.NewValue) { header.Loaded += (s, args) => { var layer = AdornerLayer.GetAdornerLayer(header); if (layer != null) { layer.Add(new BorderAdorner(header)); } }; } } } public class BorderAdorner : Adorner { public BorderAdorner(UIElement adornedElement) : base(adornedElement) { } protected override void OnRender(DrawingContext drawingContext) { var header = AdornedElement as DataGridColumnHeader; if (header == null) return; var pen = new Pen(header.BorderBrush ?? new SolidColorBrush(Colors.LightGray), 1); // 绘制右侧竖线(永远不消失) drawingContext.DrawLine(pen, new Point(header.ActualWidth - 0.5, 0), new Point(header.ActualWidth - 0.5, header.ActualHeight)); } }