【问题标题】:Change colour of column header in WPF datagrid with autogenerated columns at runtime在运行时使用自动生成的列更改 WPF 数据网格中列标题的颜色
【发布时间】:2011-12-15 15:12:24
【问题描述】:

我在 WPF 项目窗口中有一个 WPF DataGrid。我已经用DataTable 填充了网格,并自动生成了列(不幸的是,这是必需的),并且需要根据某些其他因素更改列的标题颜色。

我有一个需要突出显示的列名列表,并且可以根据此轻松找出它们的索引(因为我自己在DataGrid 中生成了它们)。

但是,我似乎无法让列标题更改颜色,这必须在代码中完成,因为我在设计时不知道哪些列需要突出显示。我已经在标题上有了一些模板......不确定这是否“覆盖”了我正在尝试做的事情。

网格:

<DataGrid FrozenColumnCount="1"  AutoGenerateColumns="True" Grid.Row="1"
    AlternationCount="2" HeadersVisibility="Column" Name="dgSkillsMatrix"
    Margin="0,0,2,1" HorizontalGridLinesBrush="White" VerticalGridLinesBrush="White"
    AlternatingRowBackground="#FFD0D0EB" RowBackground="#FFECECF5" FontSize="10.5"
    Grid.ColumnSpan="1" CellStyle="{StaticResource CellHighlighterStyle}"
    ColumnHeaderStyle="{StaticResource dataGridColumnHeader}" />

页眉模板/样式:

<DataTemplate x:Key="RotateHeaderTemplate" >
    <TextBlock Text="{Binding}" Foreground="Blue" >
        <TextBlock.LayoutTransform>
            <RotateTransform Angle="-90" />
        </TextBlock.LayoutTransform>
    </TextBlock>
</DataTemplate>

这是我迄今为止尝试更改列标题的方法(在 Window_Activated 事件上调用,因为在实际构建网格/WPF 树时在构造函数之后调用该事件):

Style newStyle = new System.Windows.Style()
{
    TargetType = typeof(DataGridColumn)
};

// SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#F70F49"))
newStyle.Setters.Add(new Setter(DataGridColumn.HeaderStringFormatProperty, new SolidColorBrush(Colors.Red)));
this.dgSkillsMatrix.Columns[4].HeaderStyle = newStyle;

【问题讨论】:

  • 为什么你的风格将HeaderStringFormat设置为Colors.Red?
  • 我只是想突出显示文本,这是可以接受的,但我宁愿突出显示整个“标题”单元格。这不起作用,但它仍然运行并且没有给出任何 WPF 异常。
  • 我只是好奇,因为HeaderStringFormat 通常类似于"M/d/yy" 或"#,##0.00",而不是颜色。
  • 哈哈......我显然在那里失败了。是的,你是对的,我在玩 HeaderCellStyle 或类似的东西,看到了这个,只是交换了属性以防它工作。

标签: c# wpf xaml datagrid


【解决方案1】:

这不会像这样工作。有很多原因。

  1. 您将 BRUSH 放在 DataGridColumn.HeaderStringFormatProperty >> 这不起作用。
  2. 这无论如何都不会转移到列的标题中。

为了能够做到这一点,您需要了解 DataGridColumnHeader 的 dataContext 默认未设置为相应的列。您必须手动设置。

看看这个帖子:https://stackoverflow.com/a/5249223/479384

现在就您而言,我会以与上述链接相同的方式做一些事情:

在 DataGridColumn 的类中添加您需要的依赖属性:

private static readonly DependencyProperty ColumnHeaderTextProperty = DependencyProperty.Register("ColumnHeader", typeof(string), typeof(MyDataGridColumn));
public string ColumnHeaderText
{
    get { return (string)(GetValue(ColumnHeaderTextProperty)); }
    set { SetValue(ColumnHeaderTextProperty, value); }
}

private static readonly DependencyProperty ColumnHeaderBackgroundProperty = DependencyProperty.Register("ColumnHeader", typeof(Brush), typeof(MyDataGridColumn));
public Brush ColumnHeaderBackground
{
    get { return (Brush)(GetValue(ColumnHeaderBackgroundProperty )); }
    set { SetValue(ColumnHeaderBackgroundProperty , value); }
}

然后像这样在列的构造函数中设置 dataContext:

public MyDataGridColumn()
{
    Header = this;
    ColumnHeaderText = "My header text";
}

(而不是您之前的 Header = "my header text";)

最后,更新您的标题模板:

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{Binding ColumnHeaderText}" Foreground="Blue" Background="{Binding ColumnHeaderBackground}">
                        <TextBlock.LayoutTransform>
                            <RotateTransform Angle="-90" />
                        </TextBlock.LayoutTransform>
                    </TextBlock>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>

那么,在你后面的代码中,当你想改变标题的背景时,只需:

((MyDataGridColumn)(this.dgSkillsMatrix.Columns[4])).ColumnHeaderBackground = Brushes.Red;

编辑:如果您的列没有特殊的类,您应该可以使用附加属性来执行此操作,并且您始终可以将我在构造函数中编写的代码放在其他地方像这样:

myColumn.Header = myColumn;
myColumn.SetValue(columnHelper.ColumnHeaderTextProperty, "my Header Text");
myColumn.SetValue(columnHelper.ColumnHeaderBackgroundProperty, Brushes.Red);

编辑哈希锁^^

【讨论】:

  • :-D 好的,就因为这个星期一早上你让我笑了^^
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 2019-09-19
  • 2012-04-20
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2021-08-24
相关资源
最近更新 更多