背景色が交互に変わる 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 をモデリングしており、その外観を複製しようとしています。私は2つの問題に直面しています:
さまざまな列の背景がセルに関連付けられており、グリッド自体のプロパティではありません。したがって、未使用の行にはこれらの背景が表示されません。空のグリッドでも列と背景を表示したいと思います。
列の背景は、透明な Expander ヘッダーの下に拡張する必要があります。(1)が満たされていれば、これもうまくいくと思います。
これらの目標は、DataGrid で直接達成できますか? そうでない場合、どのような回避策で問題を解決できるか; おそらく、DataGrids パネル (DataGridRowsPresenter) に列の背景を直接描画し、列のサイズ変更をサポートする方法はありますか?
何か案は?ありがとう!
注: この質問は類似しており、回答がありません: WPF Datagrid Template 列編集イベントと交互の列の色
アップデート:
この更新は、@LeslieDavies によって提案された回答に基づいています。このソリューションには 2 つの問題があります。
DataGrid 列のスター サイズを設定できません。星のサイズを指定しようとすると、列が際限なく大きくなります。
XAML からを削除する
DataGrid.GroupStyle
と、サイズ変更が正しく機能しなくなります。Rectangle は正しく拡張されますが、列を縮小すると Rectangle は縮小されますが、Grid 列は適切に縮小されません。
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;
}