在FullRowselect模式下禁用DataGrid当前单元格边界

我在行select模式下使用DataGrid(即SelectionUnit="FullRow" )。 我只是想要删除当前单元格周围放置的边框,当用户高亮显示一行以便进行真正的全行select(并且没有单元格级别select)时。 我不介意维护当前单元格的概念,我只是想通过改变当前单元格的样式来移除那个讨厌的当前单元格边界。 什么是最简单的方法来做到这一点?

您可以将DataGridCellBorderThickness设置为0

 <DataGrid ... SelectionUnit="FullRow"> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="BorderThickness" Value="0"/> <!-- Update from comments. Remove the focus indication for the selected cell --> <Setter Property="FocusVisualStyle" Value="{x:Null}"/> </Style> </DataGrid.CellStyle> <!-- ... --> </DataGrid> 

看到另一个接近的答案,但没有摆脱Focus矩形。 这是如何消除所有的边界。

 <DataGrid.Resources> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="BorderThickness" Value="0" /> <Setter Property="FocusVisualStyle" Value="{x:Null}" /> </Style> </DataGrid.Resources> 

此外,从技术上讲,这些单元格仍然得到了重点(你只是没有看到它),为了使制表键到下一行,而不是下一个单元格,我定义一个单元格样式基于上述,但也增加了以下…

 <DataGrid.Resources> <Style x:Key="NoFocusDataGridCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> <Setter Property="Focusable" Value="False" /> <Setter Property="IsTabStop" Value="False" /> <Setter Property="IsHitTestVisible" Value="False" /> </Style> </DataGrid.Resources> 

…然后我将它应用于除第一列定义之外的所有应用程序。 这样Tab键进入下一行,而不是下一个单元格。

但是回到边界。 如果你想隐藏它们,但仍然希望它们成为间距原因的布局的一部分,请将上面的内容更改为…

 <DataGrid.Resources> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="BorderBrush" Value="Transparent" /> <Setter Property="FocusVisualStyle" Value="{x:Null}" /> </Style> </DataGrid.Resources> 

请享用! 🙂

 <Style x:Key="DataGrid" TargetType="DataGrid"> <Setter Property="CellStyle"> <Setter.Value> <Style TargetType="DataGridCell"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" /> <Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" /> </Style> </Setter.Value> </Setter> </Style> 

如果只在单元格可编辑和select时显示边框,则可以覆盖DataGridCell模板,并为单元格IsSelected而不是IsReadOnly添加多触发器。 然后,如果为列或DataGrid设置IsReadOnly = true,则不会为单元格显示边框

 <ControlTemplate x:Key="MellowDataGridCellTemplate" TargetType="{x:Type DataGridCell}"> <Grid> <ContentPresenter VerticalAlignment="Center" /> <Rectangle Name="FocusVisual" Stroke="White" StrokeThickness="1" Fill="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> </Grid> <ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsReadOnly" Value="False" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter TargetName="FocusVisual" Property="Opacity" Value="1"/> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> 

在样式中使用模板

 <Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell"> <Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" /> </Style> 

并使用风格

 <DataGrid CellStyle={StaticResource MellowGridDataGridCell > ... </DataGrid> 

如果您使用xceed DataGridControl则将NavigationBehavior设置为RowOnly

 <xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single" ....