Files

463 lines
17 KiB
C#
Raw Permalink Normal View History

2026-01-02 17:30:41 +08:00
namespace Melskin.Assists;
2025-08-12 23:08:54 +08:00
//https://stackoverflow.com/questions/2630292/why-cant-i-style-a-datagridtextcolumn
/// <summary>
/// DataGrid样式注入
/// </summary>
public class DataGridAssist
{
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象是否应用默认样式。
/// </summary>
/// <param name="obj">要检查的依赖对象。</param>
/// <returns>如果依赖对象设置了应用默认样式则返回true否则返回false。</returns>
2025-08-12 23:08:54 +08:00
public static bool GetApplyDefaultStyle(DependencyObject obj)
{
return (bool)obj.GetValue(ApplyDefaultStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象是否应用默认样式。
/// </summary>
/// <param name="obj">要设置的依赖对象。</param>
/// <param name="value">布尔值,表示是否应用默认样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetApplyDefaultStyle(DependencyObject obj, bool value)
{
obj.SetValue(ApplyDefaultStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于指定是否对DataGrid应用默认样式。当设置为true时会根据DataGridAssist类中的定义自动应用一系列默认样式到DataGrid及其列上若设为false则不会应用这些样式。
/// 此属性主要帮助开发者快速设定DataGrid的外观而无需手动配置每个列的样式。
/// </summary>
2025-08-12 23:08:54 +08:00
public static readonly DependencyProperty ApplyDefaultStyleProperty =
DependencyProperty.RegisterAttached("ApplyDefaultStyle",
typeof(bool), typeof(DataGridAssist),
new PropertyMetadata(false, OnApplyDefaultStyleChanged));
private static void OnApplyDefaultStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if ((bool)e.NewValue)
{
if (grid.AutoGenerateColumns)
{
grid.AutoGeneratedColumns += Grid_AutoGeneratedColumns;
return;
}
UpdateTextColumnStyles(grid);
UpdateEditingTextColumnStyles(grid);
UpdateCheckBoxColumnStyles(grid);
UpdateEditingCheckBoxColumnStyles(grid);
UpdateComboBoxColumnStyles(grid);
UpdateEditingComboBoxColumnStyles(grid);
}
else
{
grid.AutoGeneratedColumns -= Grid_AutoGeneratedColumns;
}
}
private static void Grid_AutoGeneratedColumns(object? sender, EventArgs e)
{
if (sender == null)
{
return;
}
var grid = (DataGrid)sender;
UpdateTextColumnStyles(grid);
UpdateEditingTextColumnStyles(grid);
UpdateCheckBoxColumnStyles(grid);
UpdateEditingCheckBoxColumnStyles(grid);
UpdateComboBoxColumnStyles(grid);
UpdateEditingComboBoxColumnStyles(grid);
}
#region
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象的文本列样式。
/// </summary>
/// <param name="obj">要获取样式的依赖对象。</param>
/// <returns>返回指定依赖对象的文本列样式;如果没有设置,则返回默认值。</returns>
2025-08-12 23:08:54 +08:00
public static Style GetTextColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(TextColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的文本列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用到依赖对象上的样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetTextColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(TextColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于设置或获取DataGrid中的文本列样式。此属性允许开发者自定义DataGrid内文本列的显示样式比如字体、颜色等。
/// 通过设置这个属性,可以统一控制所有文本列的外观,简化了单独为每个列设置样式的复杂过程。
/// </summary>
2025-08-12 23:08:54 +08:00
public static readonly DependencyProperty TextColumnStyleProperty =
DependencyProperty.RegisterAttached("TextColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnTextColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnTextColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateTextColumnStyles(grid);
}
}
private static void UpdateTextColumnStyles(DataGrid grid)
{
var textColumnStyle = GetTextColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridTextColumn>())
{
var elementStyle = new Style
{
BasedOn = column.ElementStyle,
TargetType = textColumnStyle.TargetType
};
foreach (var setter in textColumnStyle.Setters.OfType<Setter>())
{
elementStyle.Setters.Add(setter);
}
column.ElementStyle = elementStyle;
}
}
#endregion
#region
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象的编辑文本列样式。
/// </summary>
/// <param name="obj">要获取样式的依赖对象。</param>
/// <returns>返回指定依赖对象的编辑文本列样式;如果未设置,则返回默认值。</returns>
2025-08-12 23:08:54 +08:00
public static Style GetEditingTextColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(EditingTextColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的编辑文本列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用到依赖对象的新样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetEditingTextColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(EditingTextColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于设置或获取DataGrid文本列在编辑状态下的样式。通过此属性开发者可以自定义当DataGrid中的某列处于编辑模式时的外观风格。
/// 这有助于提高用户界面的一致性和美观性同时提供更加灵活的UI定制能力。
/// </summary>
2025-08-12 23:08:54 +08:00
public static readonly DependencyProperty EditingTextColumnStyleProperty =
DependencyProperty.RegisterAttached("EditingTextColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnEditingTextColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnEditingTextColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateEditingTextColumnStyles(grid);
}
}
private static void UpdateEditingTextColumnStyles(DataGrid grid)
{
var editingTextColumnStyle = GetEditingTextColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridTextColumn>())
{
var editingElementStyle = new Style
{
BasedOn = column.EditingElementStyle,
TargetType = editingTextColumnStyle.TargetType
};
foreach (var setter in editingTextColumnStyle.Setters.OfType<Setter>())
{
editingElementStyle.Setters.Add(setter);
}
column.EditingElementStyle = editingElementStyle;
}
}
#endregion
#region
2025-08-20 12:10:13 +08:00
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
2025-08-12 23:08:54 +08:00
public static Style GetCheckBoxColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(CheckBoxColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的复选框列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用的样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetCheckBoxColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(CheckBoxColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于获取或设置复选框列的样式。此属性允许开发者为DataGrid中的复选框列自定义样式以满足特定的设计需求。
/// 通过设置该属性可以改变复选框列在DataGrid中的外观表现例如修改其大小、颜色或其他视觉属性。
/// </summary>
2025-08-12 23:08:54 +08:00
public static readonly DependencyProperty CheckBoxColumnStyleProperty =
DependencyProperty.RegisterAttached("CheckBoxColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnCheckBoxColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnCheckBoxColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateCheckBoxColumnStyles(grid);
}
}
private static void UpdateCheckBoxColumnStyles(DataGrid grid)
{
var checkBoxColumnStyle = GetCheckBoxColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridCheckBoxColumn>())
{
var checkBoxElementStyle = new Style
{
BasedOn = column.ElementStyle,
TargetType = checkBoxColumnStyle.TargetType
};
foreach (var setter in checkBoxColumnStyle.Setters.OfType<Setter>())
{
checkBoxElementStyle.Setters.Add(setter);
}
column.ElementStyle = checkBoxElementStyle;
}
}
#endregion
#region
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象的编辑复选框列样式。
/// </summary>
/// <param name="obj">要获取样式的依赖对象。</param>
/// <returns>返回指定依赖对象的编辑复选框列样式;如果没有设置,则返回默认值。</returns>
2025-08-12 23:08:54 +08:00
public static Style GetEditingCheckBoxColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(EditingCheckBoxColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的编辑复选框列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用的新样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetEditingCheckBoxColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(EditingCheckBoxColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于设置或获取DataGrid中复选框列在编辑模式下的样式。此属性允许开发者自定义当单元格进入编辑状态时复选框控件的外观和行为。
/// 通过为该属性提供一个Style对象可以控制诸如背景色、边框、字体等视觉元素以及事件处理程序等交互逻辑从而实现更符合应用需求的界面表现。
/// </summary>
2025-08-12 23:08:54 +08:00
// Using a DependencyProperty as the backing store for EditingCheckBoxColumnStyle.
public static readonly DependencyProperty EditingCheckBoxColumnStyleProperty =
DependencyProperty.RegisterAttached("EditingCheckBoxColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnEditingCheckBoxColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnEditingCheckBoxColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateEditingCheckBoxColumnStyles(grid);
}
}
private static void UpdateEditingCheckBoxColumnStyles(DataGrid grid)
{
var editingCheckBoxColumnStyle = GetEditingCheckBoxColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridCheckBoxColumn>())
{
var checkBoxElementStyle = new Style
{
BasedOn = column.EditingElementStyle,
TargetType = editingCheckBoxColumnStyle.TargetType
};
foreach (var setter in editingCheckBoxColumnStyle.Setters.OfType<Setter>())
{
checkBoxElementStyle.Setters.Add(setter);
}
column.EditingElementStyle = checkBoxElementStyle;
}
}
#endregion
#region ComboBox列注入
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象的ComboBox列样式。
/// </summary>
/// <param name="obj">要获取样式的依赖对象。</param>
/// <returns>返回指定依赖对象的ComboBox列样式如果未设置则返回默认值。</returns>
2025-08-12 23:08:54 +08:00
public static Style GetComboBoxColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(ComboBoxColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的组合框列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用到依赖对象的新样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetComboBoxColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(ComboBoxColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于设置或获取DataGrid中ComboBox列的样式。此依赖属性允许开发者为DataGrid中的特定列指定一个自定义的ComboBox样式从而实现更丰富的UI定制。
/// 通过该属性可以方便地控制ComboBox列在显示和编辑状态下的外观表现例如字体、颜色、边框等样式属性。
/// </summary>
2025-08-12 23:08:54 +08:00
public static readonly DependencyProperty ComboBoxColumnStyleProperty =
DependencyProperty.RegisterAttached("ComboBoxColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnComboBoxColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnComboBoxColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateComboBoxColumnStyles(grid);
}
}
private static void UpdateComboBoxColumnStyles(DataGrid grid)
{
var comboBoxColumnStyle = GetComboBoxColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridComboBoxColumn>())
{
var comboBoxElementStyle = new Style
{
BasedOn = column.ElementStyle,
TargetType = comboBoxColumnStyle.TargetType
};
foreach (var setter in comboBoxColumnStyle.Setters.OfType<Setter>())
{
comboBoxElementStyle.Setters.Add(setter);
}
column.ElementStyle = comboBoxElementStyle;
}
}
#endregion
#region ComboBox列
2025-08-20 12:10:13 +08:00
/// <summary>
/// 获取指定依赖对象的编辑组合框列样式。
/// </summary>
/// <param name="obj">要获取样式的依赖对象。</param>
/// <returns>返回指定依赖对象的编辑组合框列样式;如果没有设置,则返回默认值。</returns>
2025-08-12 23:08:54 +08:00
public static Style GetEditingComboBoxColumnStyle(DependencyObject obj)
{
return (Style)obj.GetValue(EditingComboBoxColumnStyleProperty);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 设置指定依赖对象的编辑组合框列样式。
/// </summary>
/// <param name="obj">要设置样式的依赖对象。</param>
/// <param name="value">要应用到依赖对象上的样式。</param>
2025-08-12 23:08:54 +08:00
public static void SetEditingComboBoxColumnStyle(DependencyObject obj, Style value)
{
obj.SetValue(EditingComboBoxColumnStyleProperty, value);
}
2025-08-20 12:10:13 +08:00
/// <summary>
/// 用于设置或获取DataGrid中ComboBox列在编辑状态下的样式。通过此属性可以自定义当用户开始编辑某ComboBox列时该列的外观。
/// 此属性允许开发者指定一个Style对象该对象定义了ComboBox列在编辑模式下的视觉表现如背景色、字体等。
/// </summary>
2025-08-12 23:08:54 +08:00
// Using a DependencyProperty as the backing store for EditingComboBoxColumnStyle.
public static readonly DependencyProperty EditingComboBoxColumnStyleProperty =
DependencyProperty.RegisterAttached("EditingComboBoxColumnStyle",
typeof(Style), typeof(DataGridAssist),
2025-08-20 12:10:13 +08:00
new PropertyMetadata(null, OnEditingComboBoxColumnStyleChanged));
2025-08-12 23:08:54 +08:00
private static void OnEditingComboBoxColumnStyleChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var grid = (DataGrid)d;
if (e.OldValue == null && e.NewValue != null)
{
UpdateEditingComboBoxColumnStyles(grid);
}
}
private static void UpdateEditingComboBoxColumnStyles(DataGrid grid)
{
var editingComboBoxColumnStyle = GetEditingComboBoxColumnStyle(grid);
foreach (var column in grid.Columns.OfType<DataGridComboBoxColumn>())
{
var comboBoxElementStyle = new Style
{
BasedOn = column.EditingElementStyle,
TargetType = editingComboBoxColumnStyle.TargetType
};
foreach (var setter in editingComboBoxColumnStyle.Setters.OfType<Setter>())
{
comboBoxElementStyle.Setters.Add(setter);
}
column.EditingElementStyle = comboBoxElementStyle;
}
}
#endregion
}