namespace Melskin.Assists; //https://stackoverflow.com/questions/2630292/why-cant-i-style-a-datagridtextcolumn /// /// DataGrid样式注入 /// public class DataGridAssist { /// /// 获取指定依赖对象是否应用默认样式。 /// /// 要检查的依赖对象。 /// 如果依赖对象设置了应用默认样式,则返回true;否则返回false。 public static bool GetApplyDefaultStyle(DependencyObject obj) { return (bool)obj.GetValue(ApplyDefaultStyleProperty); } /// /// 设置指定依赖对象是否应用默认样式。 /// /// 要设置的依赖对象。 /// 布尔值,表示是否应用默认样式。 public static void SetApplyDefaultStyle(DependencyObject obj, bool value) { obj.SetValue(ApplyDefaultStyleProperty, value); } /// /// 用于指定是否对DataGrid应用默认样式。当设置为true时,会根据DataGridAssist类中的定义自动应用一系列默认样式到DataGrid及其列上;若设为false,则不会应用这些样式。 /// 此属性主要帮助开发者快速设定DataGrid的外观而无需手动配置每个列的样式。 /// 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 文本列注入 /// /// 获取指定依赖对象的文本列样式。 /// /// 要获取样式的依赖对象。 /// 返回指定依赖对象的文本列样式;如果没有设置,则返回默认值。 public static Style GetTextColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(TextColumnStyleProperty); } /// /// 设置指定依赖对象的文本列样式。 /// /// 要设置样式的依赖对象。 /// 要应用到依赖对象上的样式。 public static void SetTextColumnStyle(DependencyObject obj, Style value) { obj.SetValue(TextColumnStyleProperty, value); } /// /// 用于设置或获取DataGrid中的文本列样式。此属性允许开发者自定义DataGrid内文本列的显示样式,比如字体、颜色等。 /// 通过设置这个属性,可以统一控制所有文本列的外观,简化了单独为每个列设置样式的复杂过程。 /// 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()) { var elementStyle = new Style { BasedOn = column.ElementStyle, TargetType = textColumnStyle.TargetType }; foreach (var setter in textColumnStyle.Setters.OfType()) { elementStyle.Setters.Add(setter); } column.ElementStyle = elementStyle; } } #endregion #region 编辑列注入 /// /// 获取指定依赖对象的编辑文本列样式。 /// /// 要获取样式的依赖对象。 /// 返回指定依赖对象的编辑文本列样式;如果未设置,则返回默认值。 public static Style GetEditingTextColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(EditingTextColumnStyleProperty); } /// /// 设置指定依赖对象的编辑文本列样式。 /// /// 要设置样式的依赖对象。 /// 要应用到依赖对象的新样式。 public static void SetEditingTextColumnStyle(DependencyObject obj, Style value) { obj.SetValue(EditingTextColumnStyleProperty, value); } /// /// 用于设置或获取DataGrid文本列在编辑状态下的样式。通过此属性,开发者可以自定义当DataGrid中的某列处于编辑模式时的外观风格。 /// 这有助于提高用户界面的一致性和美观性,同时提供更加灵活的UI定制能力。 /// 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()) { var editingElementStyle = new Style { BasedOn = column.EditingElementStyle, TargetType = editingTextColumnStyle.TargetType }; foreach (var setter in editingTextColumnStyle.Setters.OfType()) { editingElementStyle.Setters.Add(setter); } column.EditingElementStyle = editingElementStyle; } } #endregion #region 勾选框注入 /// /// /// /// /// public static Style GetCheckBoxColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(CheckBoxColumnStyleProperty); } /// /// 设置指定依赖对象的复选框列样式。 /// /// 要设置样式的依赖对象。 /// 要应用的样式。 public static void SetCheckBoxColumnStyle(DependencyObject obj, Style value) { obj.SetValue(CheckBoxColumnStyleProperty, value); } /// /// 用于获取或设置复选框列的样式。此属性允许开发者为DataGrid中的复选框列自定义样式,以满足特定的设计需求。 /// 通过设置该属性,可以改变复选框列在DataGrid中的外观表现,例如修改其大小、颜色或其他视觉属性。 /// 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()) { var checkBoxElementStyle = new Style { BasedOn = column.ElementStyle, TargetType = checkBoxColumnStyle.TargetType }; foreach (var setter in checkBoxColumnStyle.Setters.OfType()) { checkBoxElementStyle.Setters.Add(setter); } column.ElementStyle = checkBoxElementStyle; } } #endregion #region 勾选框编辑 /// /// 获取指定依赖对象的编辑复选框列样式。 /// /// 要获取样式的依赖对象。 /// 返回指定依赖对象的编辑复选框列样式;如果没有设置,则返回默认值。 public static Style GetEditingCheckBoxColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(EditingCheckBoxColumnStyleProperty); } /// /// 设置指定依赖对象的编辑复选框列样式。 /// /// 要设置样式的依赖对象。 /// 要应用的新样式。 public static void SetEditingCheckBoxColumnStyle(DependencyObject obj, Style value) { obj.SetValue(EditingCheckBoxColumnStyleProperty, value); } /// /// 用于设置或获取DataGrid中复选框列在编辑模式下的样式。此属性允许开发者自定义当单元格进入编辑状态时,复选框控件的外观和行为。 /// 通过为该属性提供一个Style对象,可以控制诸如背景色、边框、字体等视觉元素,以及事件处理程序等交互逻辑,从而实现更符合应用需求的界面表现。 /// // 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()) { var checkBoxElementStyle = new Style { BasedOn = column.EditingElementStyle, TargetType = editingCheckBoxColumnStyle.TargetType }; foreach (var setter in editingCheckBoxColumnStyle.Setters.OfType()) { checkBoxElementStyle.Setters.Add(setter); } column.EditingElementStyle = checkBoxElementStyle; } } #endregion #region ComboBox列注入 /// /// 获取指定依赖对象的ComboBox列样式。 /// /// 要获取样式的依赖对象。 /// 返回指定依赖对象的ComboBox列样式,如果未设置则返回默认值。 public static Style GetComboBoxColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(ComboBoxColumnStyleProperty); } /// /// 设置指定依赖对象的组合框列样式。 /// /// 要设置样式的依赖对象。 /// 要应用到依赖对象的新样式。 public static void SetComboBoxColumnStyle(DependencyObject obj, Style value) { obj.SetValue(ComboBoxColumnStyleProperty, value); } /// /// 用于设置或获取DataGrid中ComboBox列的样式。此依赖属性允许开发者为DataGrid中的特定列指定一个自定义的ComboBox样式,从而实现更丰富的UI定制。 /// 通过该属性,可以方便地控制ComboBox列在显示和编辑状态下的外观表现,例如字体、颜色、边框等样式属性。 /// 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()) { var comboBoxElementStyle = new Style { BasedOn = column.ElementStyle, TargetType = comboBoxColumnStyle.TargetType }; foreach (var setter in comboBoxColumnStyle.Setters.OfType()) { comboBoxElementStyle.Setters.Add(setter); } column.ElementStyle = comboBoxElementStyle; } } #endregion #region 编辑ComboBox列 /// /// 获取指定依赖对象的编辑组合框列样式。 /// /// 要获取样式的依赖对象。 /// 返回指定依赖对象的编辑组合框列样式;如果没有设置,则返回默认值。 public static Style GetEditingComboBoxColumnStyle(DependencyObject obj) { return (Style)obj.GetValue(EditingComboBoxColumnStyleProperty); } /// /// 设置指定依赖对象的编辑组合框列样式。 /// /// 要设置样式的依赖对象。 /// 要应用到依赖对象上的样式。 public static void SetEditingComboBoxColumnStyle(DependencyObject obj, Style value) { obj.SetValue(EditingComboBoxColumnStyleProperty, value); } /// /// 用于设置或获取DataGrid中ComboBox列在编辑状态下的样式。通过此属性,可以自定义当用户开始编辑某ComboBox列时该列的外观。 /// 此属性允许开发者指定一个Style对象,该对象定义了ComboBox列在编辑模式下的视觉表现,如背景色、字体等。 /// // 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()) { var comboBoxElementStyle = new Style { BasedOn = column.EditingElementStyle, TargetType = editingComboBoxColumnStyle.TargetType }; foreach (var setter in editingComboBoxColumnStyle.Setters.OfType()) { comboBoxElementStyle.Setters.Add(setter); } column.EditingElementStyle = comboBoxElementStyle; } } #endregion }