我使用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">
答案 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
触发器设置。摆脱它,死区根本不会“选择”。使用三种不同的颜色,HighlightBrushKey
和InactiveSelectionHighlightBrushKey
,一切都变得清晰。