WPF为DatagridRow和DataGridCell提供不同的选择颜色

时间:2017-07-07 14:57:38

标签: c# wpf datagrid styling

我有一个datagrid:

<DataGrid x:Name="grid" ItemsSource="{Binding DataGridCollection}" Margin="0,61,0,0" SelectionUnit="Cell">
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="BorderBrush" Value="Transparent" />
                            <Setter Property="BorderThickness" Value="0"/>
                            <Setter Property="Background" Value="#FF0070CD" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="BorderBrush" Value="Transparent" />
                            <Setter Property="BorderThickness" Value="0"/>
                            <Setter Property="Background" Value="#FF90CDFF" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>

SelectionUnit设置为&#34; Cell&#34;。我想要实现的是,当我选择一个Cell时,它会将整个Row和Cyan的蓝色设置为选定的Cell。

什么不起作用?这是我现在得到的结果:

enter image description here

这是目标:

enter image description here

1 个答案:

答案 0 :(得分:0)

好的,在尝试了一下后,我确信你不能完全用XAML做这件事。这是因为您可以选择单元格或行,但不能同时选择单元格和行。我可能在这里错了。

SelectionUnit应该仍然​​是单一的,但我们只会选择一个样式进行单元格选择。在这里,我选择了一种绿色。

<DataGrid MouseDoubleClick="DataGrid_DoubleClick" SelectionUnit="Cell">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="BorderThickness" Value="0"/>
                    <Setter Property="Background" Value="#32CD32" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

现在,我们将在后面的代码中单击该行时为该行着色。不是一个优雅的解决方案,但仍然是一个解决方案。

private void DataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DependencyObject dep = (DependencyObject)e.OriginalSource;
    DataGridCell cell = DataGridHelper.GetDataGridCell(dep);
    DataGridRow row = DataGridHelper.GetDataGridRow(dep);
    if (row != null)
    {
       if (row != lastRowSelected)
       {
           if (lastRowSelected != null)
           {
               lastRowSelected.Background = colorOfLastRowSelected;
           }
           lastRowSelected = row;
           colorOfLastRowSelected = row.Background.Clone();
       }
       row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#6A5ACD"));
    }
}

为此,我们需要两个私有字段:

private DataGridRow lastRowSelected;
private Brush colorOfLastRowSelected;

我们需要这些来记住我们选择它之前一行的颜色。这也适用于交替的行颜色。

最后,我们需要一个帮助函数来获取DataGridRow:

public static DataGridRow GetDataGridRow(DependencyObject dep)
{
    while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
    {
       dep = VisualTreeHelper.GetParent(dep);
    }

    if (dep is DataGridColumnHeader)
    {
       DataGridColumnHeader columnHeader = dep as DataGridColumnHeader;
    }

    DataGridRow row = null;

    if (dep is DataGridCell)
    {
       DataGridCell cell = dep as DataGridCell;

       // navigate further up the tree
       while ((dep != null) && !(dep is DataGridRow))
       {
           dep = VisualTreeHelper.GetParent(dep);
       }

       row = dep as DataGridRow;
    }

    return row;
}

无论如何,这应该让你到达你需要的地方!祝你好运。