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 をモデリングしており、その外観を複製しようとしています。私は2つの問題に直面しています:

  1. さまざまな列の背景がセルに関連付けられており、グリッド自体のプロパティではありません。したがって、未使用の行にはこれらの背景が表示されません。空のグリッドでも列と背景を表示したいと思います。

  2. 列の背景は、透明な Expander ヘッダーの下に拡張する必要があります。(1)が満たされていれば、これもうまくいくと思います。

これらの目標は、DataGrid で直接達成できますか? そうでない場合、どのような回避策で問題を解決できるか; おそらく、DataGrids パネル (DataGridRowsPresenter) に列の背景を直接描画し、列のサイズ変更をサポートする方法はありますか?

何か案は?ありがとう!

注: この質問は類似しており、回答がありません: WPF Datagrid Template 列編集イベントと交互の列の色


アップデート:

この更新は、@LeslieDavies によって提案された回答に基づいています。このソリューションには 2 つの問題があります。

  1. DataGrid 列のスター サイズを設定できません。星のサイズを指定しようとすると、列が際限なく大きくなります。

  2. 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;
}

列の色が交互に更新された DataGrid

4

1 に答える 1

2

これはエレガントなソリューションではありませんが、必要なビューが得られます。

  1. DataGrid の背景を「透明」にします。
  2. DataGrid の RowBackground を「透明」にします。
  3. DataGrid をグリッドに配置します。
  4. DataGrid の列と同じ数の ColumnDefinitions をグリッドに作成します。
  5. 列と同じ数の長方形を作成します。それらを各列のグリッドに配置します。Horizo​​ntalAlignment を「左」にします。それらを「塗りつぶし」で色付けします。
  6. DataGrid の場合、LayoutChanged イベントを追加します。
  7. LayoutChanged イベントのコードで、長方形の幅を更新します。元:

    四角形.Width = dataGrid.Columns[0].Width.DesiredValue;

  8. DataGrid スタイルにより、最初の四角形に (7,0,0,0) のマージンを与えます。

于 2012-06-06T04:34:15.293 に答える