簡體   English   中英

WPF DataGrid交替列顏色

[英]WPF DataGrid Alternating Column Colors

我正在嘗試創建具有交替背景顏色的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模板列編輯事件和交替列顏色


更新:

此更新基於@LeslieDavies的建議答案,它讓我大部分時間都在這里。 這個解決方案有兩個問題:

  1. 我無法對DataGrid列進行星型調整。 如果我嘗試星大小,那么這些列會連續不斷地增長。

  2. 如果我從XAML中刪除DataGrid.GroupStyle ,則調整大小不再正常。 矩形正確生長,但縮小列時,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

這不是一個優雅的解決方案,但它可以為您提供所需的視圖。

  1. 使DataGrid的背景“透明”。
  2. 使DataGrid的RowBackground“透明”。
  3. 將DataGrid放在網格中。
  4. 在GridG中創建盡可能多的ColumnDefinitions,就像在DataGrid中有列一樣。
  5. 創建與列一樣多的矩形。 將它們放在每列的網格中。 使他們的Horizo​​ntalAlignment“左”。 用“填充”為它們着色。
  6. 對於DataGrid,添加LayoutChanged事件。
  7. 在LayoutChanged事件的代碼中,更新矩形的寬度。 例如:

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

  8. 由於DataGrid樣式,給第一個矩形一個(7,0,0,0)的邊距。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM