Files
29WxOrder/Main.Test/DataGridHelper.cs
T
2026-10-21 17:11:24 +08:00

174 lines
4.5 KiB
C#

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
{
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetNoDataTips(DependencyObject obj)
{
return (string)obj.GetValue(NoDataTipsProperty);
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <param name="value"></param>
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("无数据"));
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool GetIsActive(DependencyObject obj)
{
return (bool)obj.GetValue(IsActiveProperty);
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <param name="value"></param>
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));
}
}