功能更新
This commit is contained in:
463
Melskin/Assists/DataGridAssist.cs
Normal file
463
Melskin/Assists/DataGridAssist.cs
Normal file
@@ -0,0 +1,463 @@
|
||||
namespace Melskin.Assists;
|
||||
|
||||
//https://stackoverflow.com/questions/2630292/why-cant-i-style-a-datagridtextcolumn
|
||||
/// <summary>
|
||||
/// DataGrid样式注入
|
||||
/// </summary>
|
||||
public class DataGridAssist
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象是否应用默认样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要检查的依赖对象。</param>
|
||||
/// <returns>如果依赖对象设置了应用默认样式,则返回true;否则返回false。</returns>
|
||||
public static bool GetApplyDefaultStyle(DependencyObject obj)
|
||||
{
|
||||
return (bool)obj.GetValue(ApplyDefaultStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象是否应用默认样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置的依赖对象。</param>
|
||||
/// <param name="value">布尔值,表示是否应用默认样式。</param>
|
||||
public static void SetApplyDefaultStyle(DependencyObject obj, bool value)
|
||||
{
|
||||
obj.SetValue(ApplyDefaultStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于指定是否对DataGrid应用默认样式。当设置为true时,会根据DataGridAssist类中的定义自动应用一系列默认样式到DataGrid及其列上;若设为false,则不会应用这些样式。
|
||||
/// 此属性主要帮助开发者快速设定DataGrid的外观而无需手动配置每个列的样式。
|
||||
/// </summary>
|
||||
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 文本列注入
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象的文本列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要获取样式的依赖对象。</param>
|
||||
/// <returns>返回指定依赖对象的文本列样式;如果没有设置,则返回默认值。</returns>
|
||||
public static Style GetTextColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(TextColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的文本列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用到依赖对象上的样式。</param>
|
||||
public static void SetTextColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(TextColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于设置或获取DataGrid中的文本列样式。此属性允许开发者自定义DataGrid内文本列的显示样式,比如字体、颜色等。
|
||||
/// 通过设置这个属性,可以统一控制所有文本列的外观,简化了单独为每个列设置样式的复杂过程。
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty TextColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("TextColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnTextColumnStyleChanged));
|
||||
|
||||
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 编辑列注入
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象的编辑文本列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要获取样式的依赖对象。</param>
|
||||
/// <returns>返回指定依赖对象的编辑文本列样式;如果未设置,则返回默认值。</returns>
|
||||
public static Style GetEditingTextColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(EditingTextColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的编辑文本列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用到依赖对象的新样式。</param>
|
||||
public static void SetEditingTextColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(EditingTextColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于设置或获取DataGrid文本列在编辑状态下的样式。通过此属性,开发者可以自定义当DataGrid中的某列处于编辑模式时的外观风格。
|
||||
/// 这有助于提高用户界面的一致性和美观性,同时提供更加灵活的UI定制能力。
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty EditingTextColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("EditingTextColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnEditingTextColumnStyleChanged));
|
||||
|
||||
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 勾选框注入
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static Style GetCheckBoxColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(CheckBoxColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的复选框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用的样式。</param>
|
||||
public static void SetCheckBoxColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(CheckBoxColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于获取或设置复选框列的样式。此属性允许开发者为DataGrid中的复选框列自定义样式,以满足特定的设计需求。
|
||||
/// 通过设置该属性,可以改变复选框列在DataGrid中的外观表现,例如修改其大小、颜色或其他视觉属性。
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty CheckBoxColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("CheckBoxColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnCheckBoxColumnStyleChanged));
|
||||
|
||||
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 勾选框编辑
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象的编辑复选框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要获取样式的依赖对象。</param>
|
||||
/// <returns>返回指定依赖对象的编辑复选框列样式;如果没有设置,则返回默认值。</returns>
|
||||
public static Style GetEditingCheckBoxColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(EditingCheckBoxColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的编辑复选框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用的新样式。</param>
|
||||
public static void SetEditingCheckBoxColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(EditingCheckBoxColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于设置或获取DataGrid中复选框列在编辑模式下的样式。此属性允许开发者自定义当单元格进入编辑状态时,复选框控件的外观和行为。
|
||||
/// 通过为该属性提供一个Style对象,可以控制诸如背景色、边框、字体等视觉元素,以及事件处理程序等交互逻辑,从而实现更符合应用需求的界面表现。
|
||||
/// </summary>
|
||||
// Using a DependencyProperty as the backing store for EditingCheckBoxColumnStyle.
|
||||
public static readonly DependencyProperty EditingCheckBoxColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("EditingCheckBoxColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnEditingCheckBoxColumnStyleChanged));
|
||||
|
||||
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列注入
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象的ComboBox列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要获取样式的依赖对象。</param>
|
||||
/// <returns>返回指定依赖对象的ComboBox列样式,如果未设置则返回默认值。</returns>
|
||||
public static Style GetComboBoxColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(ComboBoxColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的组合框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用到依赖对象的新样式。</param>
|
||||
public static void SetComboBoxColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(ComboBoxColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于设置或获取DataGrid中ComboBox列的样式。此依赖属性允许开发者为DataGrid中的特定列指定一个自定义的ComboBox样式,从而实现更丰富的UI定制。
|
||||
/// 通过该属性,可以方便地控制ComboBox列在显示和编辑状态下的外观表现,例如字体、颜色、边框等样式属性。
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty ComboBoxColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("ComboBoxColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnComboBoxColumnStyleChanged));
|
||||
|
||||
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列
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定依赖对象的编辑组合框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要获取样式的依赖对象。</param>
|
||||
/// <returns>返回指定依赖对象的编辑组合框列样式;如果没有设置,则返回默认值。</returns>
|
||||
public static Style GetEditingComboBoxColumnStyle(DependencyObject obj)
|
||||
{
|
||||
return (Style)obj.GetValue(EditingComboBoxColumnStyleProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置指定依赖对象的编辑组合框列样式。
|
||||
/// </summary>
|
||||
/// <param name="obj">要设置样式的依赖对象。</param>
|
||||
/// <param name="value">要应用到依赖对象上的样式。</param>
|
||||
public static void SetEditingComboBoxColumnStyle(DependencyObject obj, Style value)
|
||||
{
|
||||
obj.SetValue(EditingComboBoxColumnStyleProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用于设置或获取DataGrid中ComboBox列在编辑状态下的样式。通过此属性,可以自定义当用户开始编辑某ComboBox列时该列的外观。
|
||||
/// 此属性允许开发者指定一个Style对象,该对象定义了ComboBox列在编辑模式下的视觉表现,如背景色、字体等。
|
||||
/// </summary>
|
||||
// Using a DependencyProperty as the backing store for EditingComboBoxColumnStyle.
|
||||
public static readonly DependencyProperty EditingComboBoxColumnStyleProperty =
|
||||
DependencyProperty.RegisterAttached("EditingComboBoxColumnStyle",
|
||||
typeof(Style), typeof(DataGridAssist),
|
||||
new PropertyMetadata(null, OnEditingComboBoxColumnStyleChanged));
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user