0

我正在尝试创建一个具有交替背景颜色的 WPF DataGrid。我目前正在使用 DataGridTemplateColumn 列并设置 CellStyle 背景颜色,但对此结果并不完全满意:

具有交替列颜色的简化示例 WPF DataGrid

<DataGridTemplateColumn.CellStyle>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="False">
                <Setter Property="Background" Value="#FFF7F7F7" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGridTemplateColumn.CellStyle>

我正在根据现有的 WinForms 项目对我的 DataGrid 进行建模,并尝试复制它的外观。我面临两个问题:

  1. 不同的列背景附加到单元格,而不是网格本身的属性。因此未使用的行不显示这些背景。我什至想要一个空网格来显示列和背景。

  2. 列背景应该在透明的 Expander 标题下延伸。我相信如果满足(1),这也可以。

可以直接使用 DataGrid 实现这些目标吗?如果没有,什么变通方法可以解决问题;也许以某种方式直接在 DataGrids 面板 (DataGridRowsPresenter) 上绘制列背景并支持列调整大小?

有任何想法吗?谢谢!

注意:这个问题类似且未回答: WPF Datagrid Template column edit event and alter column color


更新:

此更新基于@LeslieDavies 提出的答案,这让我大部分时间都在那里。我对这个解决方案有两个问题:

  1. 我无法为DataGrid 列设置星号。如果我尝试增加星号,则列会不断增长而不受限制。

  2. 如果我DataGrid.GroupStyle从 XAML 中删除 ,则调整大小将不再正常工作。矩形正确增长,但是当缩小列时,矩形会缩小,但网格列不能正确缩小。

XAML:

<Window x:Class="GridColumnColors.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Background="Black">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Rectangle Name="Rect0" Grid.Column="0" HorizontalAlignment="Left" Margin="-1,0,0,0" Fill="#FFCACACA" />
        <Rectangle Name="Rect1" Grid.Column="1" HorizontalAlignment="Left" Margin="-1,0,0,0" Fill="White"/>
        <Rectangle Name="Rect2" Grid.Column="2" HorizontalAlignment="Left" Margin="-1,0,0,0" Fill="#FFCACACA"/>
        <DataGrid Name="DataGridStudents"  AutoGenerateColumns="False" Visibility="Visible" Grid.ColumnSpan="4" ItemsSource="{Binding StudentsCollectionView}"
                    SelectionMode="Extended" GridLinesVisibility="None" RowHeaderWidth="0"  RowBackground="Transparent"
                    CanUserResizeRows="False" IsReadOnly="True" Background="Transparent" LayoutUpdated="Students_LayoutUpdated">
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander Header="{Binding}">
                                            <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
            <DataGrid.Columns>
                <DataGridTextColumn Header="First Name" MinWidth="100" Binding="{Binding FirstName}"/>
                <DataGridTextColumn Header="Last Name"  MinWidth="100" Binding="{Binding LastName}"/>
                <DataGridTextColumn Header="Age"        MinWidth="100" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

代码背后:

private void Students_LayoutUpdated(object sender, EventArgs e)
{
    Rect0.Width = DataGridStudents.Columns[0].ActualWidth+3;
    Rect1.Width = DataGridStudents.Columns[1].ActualWidth+0;
    Rect2.Width = DataGridStudents.Columns[2].ActualWidth+1;
}

更新了交替列颜色的 DataGrid

4

1 回答 1

2

这不是一个优雅的解决方案,但它为您提供了您想要的视图。

  1. 使 DataGrid 的背景“透明”。
  2. 将 DataGrid 的 RowBackground 设为“透明”。
  3. 将 DataGrid 放在网格中。
  4. 在 Grid 中创建与 DataGrid 中的列一样多的 ColumnDefinition。
  5. 创建与列一样多的矩形。将它们放在每列的网格中。使他们的水平对齐“左”。用他们的“填充”给它们上色。
  6. 对于 DataGrid,添加一个 LayoutChanged 事件。
  7. 在 LayoutChanged 事件的代码中,更新矩形的宽度。前任:

    rectangle.Width = dataGrid.Columns[0].Width.DesiredValue;

  8. 由于 DataGrid 样式,给第一个矩形的边距 (7,0,0,0)。

于 2012-06-06T04:34:15.293 回答