174 lines
4.5 KiB
C#
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));
|
|
}
|
|
}
|