2016-04-11 89 views
0

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

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

我也尝试添加了DataGridRows风格:

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

这类作品,虽然,在DataGrid负载,或者当我的程序是没有焦点,它看起来像这样: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

你可以显示“DataGridRows”的'Style'标签吗? –

+0

编辑该帖子以显示它 – KSF

+0

你如何将它应用到网格?您的代码适用于DataGrid上的'RowStyle =“{StaticResource DataGridRowStyle}”'。 –

回答

1

你妈Ÿ清晰的默认高亮颜色,让你的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> 
+0

我试过了,我将颜色设置为橙色。现在,当我突出显示一行时,它看起来像这样:http://imgur.com/HQH8wvj(我将SolidColorBrush的颜色指定为橙色)。蓝色在那里,因为我选择的画笔正在绘制它的颜色。我无法弄清楚为什么/为什么列的处理方式不同于末尾的空白空间,而不考虑行的绘制行为。 – KSF

+0

似乎DataGrid使用SystemColors.HighlightBrushKey突出显示现有列占用的行的一部分。我建议使HighlightBrushKey透明而不是橙色,然后将您的SelectedBrush更改为您想要的任何颜色。 –

+1

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

2

为了使这项工作,我用安东的建议:

此外,在DataGrid中列由两个部分组成,其中一个被细胞占据,另一个不是。您也可以使用相同的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> 

这允许绘制的颜色延长负载整个行或当程序失去焦点。

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,这一切都变得清晰。

安东丹尼洛夫非常非常接近。但答案并不是让这些画笔变得透明,而是让它们成为你想要的颜色。