wpf - selecciono - poner el foco en una celda de un datagridview c#
Deshabilitar el borde de celda actual de DataGrid en el modo de selección FullRow (5)
Estoy usando un DataGrid en el modo de selección de fila (es decir, SelectionUnit="FullRow"
). Simplemente quiero eliminar el borde que se coloca alrededor de la celda actual cuando el usuario resalta una fila para tener una verdadera selección de fila completa (y ninguna selección de nivel de celda). No me importa la noción de que la cuadrícula mantiene la celda actual, solo quiero eliminar ese molesto borde de la celda actual, tal vez cambiando el estilo de la celda actual. ¿Cuál es la forma más fácil de hacer esto?
Podría establecer el BorderThickness
para DataGridCell
en 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>
Si desea mostrar un borde solo cuando la celda sea editable y seleccionada, puede anular la plantilla de DataGridCell y agregar un multigigador para cuando la celda se seleccione y no IsReadOnly. Entonces, no se mostrará un borde para las celdas si establece IsReadOnly = true para la columna o el DataGrid
<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>
Usa la plantilla en un estilo.
<Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell">
<Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" />
</Style>
Y usa el estilo
<DataGrid CellStyle={StaticResource MellowGridDataGridCell >
...
</DataGrid>
Si está utilizando el xceed
DataGridControl
entonces configure NavigationBehavior
en RowOnly
<xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single" ....
Vio otra respuesta aquí que estaba cerca, pero no eliminó el rectángulo de enfoque. Aquí es cómo borrar todas las fronteras.
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</DataGrid.Resources>
Además, dado que técnicamente esas celdas aún se enfocan (simplemente no lo ves), para que la tecla de tabulación avance a la siguiente fila en lugar de a la siguiente celda, defino un estilo de celda basado en lo anterior pero que también agrega el siguiendo...
<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>
... luego aplico eso a todos menos a la primera definición de columna. De esa manera, la tecla de tabulación avanza a la siguiente fila, no a la siguiente celda.
Volver a las fronteras sin embargo. Si desea ocultarlos pero desea que formen parte del diseño por razones de espaciado, cambie lo anterior a este ...
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</DataGrid.Resources>
¡Disfrutar! :)
<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>