WPF DataGrid突出显示整行

时间:2016-04-11 16:57:21

标签: c# wpf datagrid

我使用WPF数据网格来显示数据。我试图弄清楚如何在单击某个项目时突出显示整行,如果末尾有空白空间,则包括末尾的空列/空格(我使用动态生成的列)。请注意,我并不是只想突出某个特定的细胞。我http://imgur.com/7Xjoj2H就是我所看到的。行末尾的未使用空间是当前没有列的空间,并且未突出显示。我希望在单击该行时突出显示该空间。我试过了:

将宽度设置为auto的最后一列以填充剩余空间。这对我不起作用,因为这样做会禁用水平滚动条,因为我使用了动态创建的列,所以我需要它。

我还尝试为DataGridRows添加样式:

<Trigger Property="IsSelected"
                 Value="true">
            <Setter Property="Background"
                    Value="{StaticResource SelectedBrush}" />
        </Trigger>

虽然这种方式有用,但是当数据网格加载时,或者当我的程序没有聚焦时,它看起来像这样:http://imgur.com/EtTmBbH其中只突出显示未使用空间的最后一个区域。

如果可能的话,我不想通过在末尾添加一个空白的虚拟列来解决这个问题,因为这会导致与将上一列宽度设置为自动高于上面相同的问题。

有什么建议吗?

编辑:

以下是DataGridRow样式的代码:

<Style TargetType="{x:Type DataGridRow}"
       x:Key="DataGridRowStyle">

    <Setter Property="Background"
            Value="White" />

    <Style.Triggers>
        <Trigger Property="AlternationIndex"
                 Value="1">
            <Setter Property="Background"
                    Value="#efefef" />
        </Trigger>

        <Trigger Property="IsMouseOver"
                 Value="true">
            <Setter Property="Background"
                    Value="{StaticResource RolloverBrush}" />
        </Trigger>
        <Trigger Property="IsSelected"
                 Value="true">
            <Setter Property="Background"
                    Value="{StaticResource SelectedBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

选择的画笔:

<LinearGradientBrush x:Key="SelectedBrush"
                     StartPoint="0,0"
                     EndPoint="0,1">
    <GradientStop Offset="0"
                  Color="#3399FF" />
</LinearGradientBrush>

datagrid的代码:

        <DataGrid x:Name="JobListView"
              AutoGenerateColumns="False"
              ItemsSource="{Binding UnitStatusCollection, Mode=TwoWay}"
              CanUserDeleteRows="False"
              Style="{StaticResource JobGridViewStyle}"
              SelectedIndex="{Binding JobsListViewSelectedIndex, Mode=TwoWay}"
              SelectedItem="{Binding JobsListViewSelectedUnitStatusPair}"
              Utility:DataGridColumnsBehavior.BindableColumns="{Binding DataGridColumns}"
              ContextMenu="{StaticResource ListViewContextMenu}"
              Margin="10,0"
              Grid.Row="1"
              HorizontalAlignment="Stretch"
              HorizontalContentAlignment="Stretch"
              RowStyle="{StaticResource DataGridRowStyle}"
              AlternationCount="2"
              HorizontalGridLinesBrush="#5A5A5F"
              VerticalGridLinesBrush="#5A5A5F">

3 个答案:

答案 0 :(得分:2)

您可以清除默认突出显示颜色,以便改为使用SelectedBrush:

    <DataGrid ...>
        <DataGrid.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#00000000"/>
        </DataGrid.Resources>
    </DataGrid>

答案 1 :(得分:2)

为了完成这项工作,我使用了Anton的建议:

  

此外,DataGrid中的一行由2部分组成,其中一部分由单元格占用,第二部分不是。您也可以使用相同的SelectedBrush设置CellStyle。在这种情况下,单元格将以正确的颜色突出显示。

我所做的是为DataGridCellStyle创建一个样式并为IsSelected创建一个触发器:

<Style x:Key="DataGridCellStyle"
       TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <Trigger Property="IsSelected"
                 Value="True">
            <Setter Property="Background"
                    Value="{StaticResource SelectedBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

绘制与所选行背景颜色相同的单元格背景。这是除了:

<Style TargetType="{x:Type DataGridRow}"
       x:Key="DataGridRowStyle">
    <Style.Triggers>
        <Trigger Property="IsSelected"
                 Value="true">
            <Setter Property="Background"
                    Value="{StaticResource SelectedBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

这允许绘制的颜色在加载时或程序失去焦点时延伸到整个行。

答案 2 :(得分:1)

我找到了另一个解决方案,实际上有点简单:

<DataGrid.Resources>
    <!-- Select everything with orange... -->
    <SolidColorBrush 
        Color="#ff9933" 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" />
    <!-- ...all the time -->
    <SolidColorBrush 
        Color="#ff9933" 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" />
</DataGrid.Resources>

问题在于整个行突出显示,但是当焦点丢失时,“未选定”的单元格会以不同的颜色突出显示:非活动选择突出显示颜色。

行尾的死区背景由IsSelected=True触发器设置。摆脱它,死区根本不会“选择”。使用三种不同的颜色,HighlightBrushKeyInactiveSelectionHighlightBrushKey,一切都变得清晰。

Anton Danylov非常非常接近。但答案不是让这些画笔透明,而是让它们成为你想要的颜色。