我正在尝试创建一个具有交替背景颜色的 WPF DataGrid。我目前正在使用 DataGridTemplateColumn 列并设置 CellStyle 背景颜色,但对此结果并不完全满意:
<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 进行建模,并尝试复制它的外观。我面临两个问题:
不同的列背景附加到单元格,而不是网格本身的属性。因此未使用的行不显示这些背景。我什至想要一个空网格来显示列和背景。
列背景应该在透明的 Expander 标题下延伸。我相信如果满足(1),这也可以。
可以直接使用 DataGrid 实现这些目标吗?如果没有,什么变通方法可以解决问题;也许以某种方式直接在 DataGrids 面板 (DataGridRowsPresenter) 上绘制列背景并支持列调整大小?
有任何想法吗?谢谢!
注意:这个问题类似且未回答: WPF Datagrid Template column edit event and alter column color
更新:
此更新基于@LeslieDavies 提出的答案,这让我大部分时间都在那里。我对这个解决方案有两个问题:
我无法为DataGrid 列设置星号。如果我尝试增加星号,则列会不断增长而不受限制。
如果我
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;
}